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 认证,从而安全有效地验证用户身份并授权用户访问相应的资源。

相关文章
|
2月前
|
JSON 安全 数据安全/隐私保护
Python认证新风尚:OAuth遇上JWT,安全界的时尚Icon👗
【10月更文挑战第2天】在当今互联网世界中,数据安全与隐私保护日益重要。Python 作为广泛应用于 Web 开发的语言,其认证机制也不断进化。OAuth 2.0 和 JSON Web Tokens (JWT) 成为当前最热门的安全认证方案,不仅保障数据安全传输,还简化了用户认证流程。本文将介绍 Python 如何结合 OAuth 2.0 和 JWT 打造安全高效的认证体系。
41 3
|
25天前
|
JSON 安全 算法
Spring Boot 应用如何实现 JWT 认证?
Spring Boot 应用如何实现 JWT 认证?
59 8
|
1月前
|
开发框架 监控 .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
|
1月前
|
JSON 安全 数据安全/隐私保护
Python认证新风尚:OAuth遇上JWT,安全界的时尚Icon👗
在当今互联网世界中,数据安全和隐私保护至关重要。Python 作为 Web 开发的主流语言,其认证机制也在不断进步。OAuth 2.0 和 JSON Web Tokens (JWT) 是当前最热门的安全认证方案,不仅保障数据安全传输,还简化用户认证流程。本文介绍如何在 Python 中结合 OAuth 2.0 和 JWT,打造一套既安全又高效的认证体系。通过 Flask-HTTPAuth 和 PyJWT 等库,实现授权和验证功能,确保每次请求的安全性和便捷性。
40 3
|
3月前
|
安全 Java 数据安全/隐私保护
|
3月前
|
JSON 安全 数据安全/隐私保护
从0到1搭建权限管理系统系列三 .net8 JWT创建Token并使用
【9月更文挑战第22天】在.NET 8中,从零开始搭建权限管理系统并使用JWT(JSON Web Tokens)创建Token是关键步骤。JWT是一种开放标准(RFC 7519),用于安全传输信息,由头部、载荷和签名三部分组成。首先需安装`Microsoft.AspNetCore.Authentication.JwtBearer`包,并在`Program.cs`中配置JWT服务。接着,创建一个静态方法`GenerateToken`生成包含用户名和角色的Token。最后,在控制器中使用`[Authorize]`属性验证和解析Token,从而实现身份验证和授权功能。
231 3
|
3月前
|
数据采集 JSON API
.NET 3.5 中 HttpWebRequest 的核心用法及应用
【9月更文挑战第7天】在.NET 3.5环境下,HttpWebRequest 类是处理HTTP请求的一个核心组件,它封装了HTTP协议的细节,使得开发者可以方便地发送HTTP请求并接收响应。本文将详细介绍HttpWebRequest的核心用法及其实战应用。
152 6
|
20天前
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
73 5
|
4月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
270 0
|
2月前
|
JSON 安全 算法
下一篇
DataWorks