JWT Bearer 认证在 .NET Core 中的应用

简介: 【10月更文挑战第30天】JWT(JSON Web Token)是一种开放标准,用于在各方之间安全传输信息。它由头部、载荷和签名三部分组成,用于在用户和服务器之间传递声明。JWT Bearer 认证是一种基于令牌的认证方式,客户端在请求头中包含 JWT 令牌,服务器验证令牌的有效性后授权用户访问资源。在 .NET Core 中,通过安装 `Microsoft.AspNetCore.Authentication.JwtBearer` 包并配置认证服务,可以实现 JWT Bearer 认证。具体步骤包括安装 NuGet 包、配置认证服务、启用认证中间件、生成 JWT 令牌以及在控制器中使用认证信息

1. 什么是 JWT(JSON Web Token)?


JWT 是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它是一种紧凑的、自包含的方式,用于在用户和服务器之间传递声明(claims)。声明是关于用户的信息片段,如用户 ID、角色等。


JWT 由三部分组成,分别是头部(header)、载荷(payload)和签名(signature),格式为header.payload.signature


  • 头部(header):通常包含令牌的类型(如 JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)。例如,{"alg": "HS256", "typ": "JWT"}
  • 载荷(payload):包含声明,这些声明可以是标准的(如 iss - 发行者、sub - 主题、aud - 受众等),也可以是自定义的用户相关信息,如用户 ID、用户名等。例如,{"sub": "1234567890", "name": "John Doe", "admin": true}
  • 签名(signature):是根据头部和载荷以及一个密钥(secret)来生成的,用于验证消息在传递过程中没有被篡改。


2. 什么是 JWT Bearer 认证?


JWT Bearer 认证是一种基于令牌的认证方式。当客户端向服务器发送请求时,它在请求头(通常是Authorization头)中包含 JWT 令牌。服务器收到请求后,会验证令牌的有效性,包括签名是否正确、令牌是否过期等。如果令牌有效,服务器就可以根据令牌中的声明来授权用户访问相应的资源。


3. 在.NET Core 中应用 JWT Bearer 认证


(1)安装必要的 NuGet 包


  • Microsoft.AspNetCore.Authentication.JwtBearer:这是用于在.NET Core 应用程序中实现 JWT Bearer 认证的核心包。


可以通过在 Visual Studio 的 NuGet 包管理器控制台中运行以下命令来安装:


Install - Package Microsoft.AspNetCore.Authentication.JwtBearer


(2)配置 JWT Bearer 认证服务


  • Startup.cs文件的ConfigureServices方法中,添加以下代码来配置 JWT Bearer 认证:


using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
//...
public void ConfigureServices(IServiceCollection services)
{
    // 其他服务配置...
    // 配置JWT Bearer认证
    var key = "your_secret_key"; // 这里应该是一个安全的密钥,用于签名令牌,实际应用中不要使用明文
    var issuer = "your_issuer"; 
    var audience = "your_audience";
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
      .AddJwtBearer(options =>
       {
           options.TokenValidationParameters = new TokenValidationParameters
           {
               ValidateIssuer = true,
               ValidateAudience = true,
               ValidateLifetime = true,
               ValidateIssuerSigningKey = true,
               ValidIssuer = issuer,
               ValidAudience = audience,
               IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key))
           };
       });
}


  • 上述代码中:
  • ValidateIssuerValidateAudienceValidateLifetimeValidateIssuerSigningKey用于指定令牌验证的规则。例如,ValidateIssuer设置为true表示要验证令牌的发行者。
  • ValidIssuerValidAudience指定了有效的发行者和受众的值。
  • IssuerSigningKey是用于验证令牌签名的密钥,这里使用了对称密钥(SymmetricSecurityKey),也可以使用非对称密钥(如 RSA 密钥)。


(3)在请求管道中启用认证


  • Startup.cs文件的Configure方法中,添加以下代码来启用认证中间件:


public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 其他中间件配置...
    app.UseAuthentication();
    app.UseAuthorization();
    // 其他中间件配置...
}


  • UseAuthentication用于设置认证中间件,它会处理请求头中的认证信息。UseAuthorization用于设置授权中间件,它会根据认证结果和授权策略来决定用户是否有权访问资源。


(4)生成 JWT 令牌


  • 通常,在用户登录成功后,服务器需要生成 JWT 令牌并返回给客户端。以下是一个简单的示例,用于生成 JWT 令牌:


using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;
//...
public string GenerateJwtToken(string userId, string userName)
{
    var key = "your_secret_key";
    var issuer = "your_issuer";
    var audience = "your_audience";
    var claims = new[]
    {
        new Claim(ClaimTypes.NameIdentifier, userId),
        new Claim(ClaimTypes.Name, userName)
    };
    var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key));
    var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HS256);
    var token = new JwtSecurityToken(
        issuer: issuer,
        audience: audience,
        claims: claims,
        expires: DateTime.Now.AddHours(1),
        signingCredentials: credentials);
    return new JwtSecurityTokenHandler().WriteToken(token);
}


  • 在上述示例中:
  • 首先定义了令牌的密钥、发行者和受众。
  • 创建了一些声明(claims),这里包含了用户 ID 和用户名。
  • 创建了签名凭证(SigningCredentials),使用之前定义的密钥和签名算法(HS256)。
  • 构建了JwtSecurityToken对象,设置了发行者、受众、声明、过期时间和签名凭证。
  • 最后使用JwtSecurityTokenHandler将令牌对象转换为字符串并返回。


(5)在控制器或服务中使用认证后的信息


  • 在控制器方法上,可以使用[Authorize]属性来要求用户进行认证才能访问该方法。例如:


using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[Authorize]
[Route("api/[controller]")]
public class MyController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
        var userName = User.FindFirst(ClaimTypes.Name)?.Value;
        // 根据用户ID和用户名进行相应的操作...
        return Ok(new { UserId = userId, UserName = userName });
    }
}


  • 在上述控制器方法中,通过User属性可以访问经过认证后的用户信息(声明)。可以使用FindFirst方法来获取特定的声明值,如用户 ID 和用户名。


通过以上步骤,就可以在.NET Core 应用程序中实现 JWT Bearer 认证,从而安全有效地验证用户身份并授权用户访问相应的资源。

相关文章
|
9月前
|
JSON 安全 Java
什么是用于REST API的JWT Bearer令牌以及如何通过代码和工具进行调试
在Web开发中,保护REST API至关重要,而JSON Web令牌(JWT)特别是JWT Bearer令牌,是一种高效方法。它通过紧凑、自包含的结构实现安全信息交换,提升用户体验。本文探讨JWT Bearer的基本概念、结构与实现,包括在Java中的应用步骤,以及使用Apipost和cURL进行测试的方法。JWT优势明显:无状态、互操作性强,适用于分布式系统。掌握JWT Bearer,可助开发者构建更安全、高效的API解决方案。
|
9月前
|
存储 安全 JavaScript
秘密任务 3.0:如何通过 JWT 认证确保 WebSockets 安全
本文探讨了如何通过JWT认证保障WebSockets通信安全,防止敏感数据泄露和未授权访问。首先介绍了保护WebSockets的重要性,随后详细讲解了JWT与WebSockets的协同工作流程:特工通过API登录获取JWT,建立连接时提供令牌,服务器验证后决定是否授权。还提供了Node.js实现示例及客户端连接方法,并分享了最佳实践,如使用HTTP-only Cookie、短生命周期令牌和WSS加密。最后推荐了Apipost工具助力实时测试与调试,确保构建高效安全的实时网络。
|
C# Android开发 iOS开发
2025年全面的.NET跨平台应用框架推荐
2025年全面的.NET跨平台应用框架推荐
575 23
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
869 11
|
JSON 安全 算法
Spring Boot 应用如何实现 JWT 认证?
Spring Boot 应用如何实现 JWT 认证?
1259 8
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
282 5
|
JSON 安全 数据安全/隐私保护
Python认证新风尚:OAuth遇上JWT,安全界的时尚Icon👗
在当今互联网世界中,数据安全和隐私保护至关重要。Python 作为 Web 开发的主流语言,其认证机制也在不断进步。OAuth 2.0 和 JSON Web Tokens (JWT) 是当前最热门的安全认证方案,不仅保障数据安全传输,还简化用户认证流程。本文介绍如何在 Python 中结合 OAuth 2.0 和 JWT,打造一套既安全又高效的认证体系。通过 Flask-HTTPAuth 和 PyJWT 等库,实现授权和验证功能,确保每次请求的安全性和便捷性。
223 3
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
423 5
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
472 0
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
252 7