首页 > 其他分享 >.NET 中使用 JWT 进行身份验证和授权

.NET 中使用 JWT 进行身份验证和授权

时间:2025-01-17 11:24:59浏览次数:1  
标签:验证 JWT 身份验证 token new NET

在 .NET 中使用 JWT 进行身份验证和授权

在现代 Web 开发中,身份验证和授权是至关重要的,尤其是在构建分布式应用和微服务时。JSON Web Token (JWT) 是一种非常流行的解决方案,用于在不同系统之间传递身份验证信息和授权信息。在本文中,我们将探讨如何在 .NET 中使用 JWT,介绍如何创建、签名、验证和解析 JWT。

什么是 JWT?

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境中安全地传输信息。JWT 是通过将信息编码成 JSON 格式并进行加密和签名来确保信息的安全性。JWT 主要由三部分组成:

  1. Header(头部):包含算法信息(如 HMAC SHA256 或 RSA)和 token 类型(通常为 JWT)。
  2. Payload(负载):存放需要传递的声明(Claims),如用户信息、过期时间等。
  3. Signature(签名):用于验证 token 的真实性,确保信息未被篡改。

JWT 采用以下格式:

xxxxx.yyyyy.zzzzz

JWT 常用于 Web API 的身份验证中,尤其是作为 Bearer Token 来认证用户身份。


1. 安装所需的 NuGet 包

在 .NET 中使用 JWT,首先需要安装相关的 NuGet 包。常用的包包括 System.IdentityModel.Tokens.JwtMicrosoft.AspNetCore.Authentication.JwtBearer

在终端或包管理器控制台中,运行以下命令来安装这些包:

dotnet add package System.IdentityModel.Tokens.Jwt
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

2. JWT 的基本结构

JWT 是一个包含三部分的字符串,通常如下所示:

xxxxx.yyyyy.zzzzz
  • Header(头部):描述了签名的算法(例如:HMAC SHA256)。
  • Payload(负载):存储数据,如用户的身份信息(比如用户ID、用户名、角色等)。
  • Signature(签名):用于验证数据的完整性,防止数据在传输过程中被篡改。

3. 在 .NET 中生成 JWT

生成 JWT 通常需要使用 JwtSecurityTokenHandler 类,并指定密钥和相关声明。

示例:生成 JWT

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;
using System.Text;

public class JwtHelper
{
    private static string SecretKey = "your-256-bit-secret";  // 用于签名的密钥

    public static string GenerateToken(string username)
    {
        var claims = new[] {
            new Claim(JwtRegisteredClaimNames.Sub, username),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
            new Claim(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString(), ClaimValueTypes.DateTime),
        };

        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SecretKey));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var token = new JwtSecurityToken(
            issuer: "yourdomain.com",  // 可选,发行者
            audience: "yourdomain.com",  // 可选,受众
            claims: claims,
            expires: DateTime.Now.AddHours(1),  // 设置 token 的过期时间
            signingCredentials: creds
        );

        return new JwtSecurityTokenHandler().WriteToken(token);  // 返回 token 字符串
    }
}

解释:

  1. Claims(声明):声明包含我们需要传递的数据。在这个例子中,我们传递了用户的 sub(主题)、jti(JWT ID)和 iat(签发时间)。
  2. SigningCredentials(签名凭证):这部分定义了签名算法和密钥。我们使用了 HMAC SHA256 算法进行签名。
  3. JwtSecurityTokenHandler:该类负责将 JwtSecurityToken 对象转换为 JWT 字符串。

4. 在 ASP.NET Core 中验证 JWT

为了确保请求来自已授权的用户,我们可以在 Web API 中配置 JWT Bearer 认证中间件。

配置 JWT Bearer 认证

Startup.cs 文件的 ConfigureServices 方法中,我们需要配置 JWT Bearer 认证中间件来验证传入的 JWT。

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidateAudience = true,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                ValidIssuer = "yourdomain.com",  // 配置合法的发行者
                ValidAudience = "yourdomain.com",  // 配置合法的受众
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-256-bit-secret"))  // 配置密钥
            };
        });

    services.AddControllers();
}

在这里,我们设置了:

  • ValidateIssuer:验证 JWT 的发行者是否合法。
  • ValidateAudience:验证 JWT 的受众是否合法。
  • ValidateLifetime:验证 JWT 是否已过期。
  • IssuerSigningKey:设置用于签名验证的密钥。

5. 启用身份验证和授权

Startup.cs 文件的 Configure 方法中,我们需要启用身份验证和授权中间件:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();

    // 启用认证中间件
    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

6. 使用 JWT 进行授权

我们可以使用 [Authorize] 特性来保护需要身份验证的 API 控制器或方法。例如,保护一个获取用户信息的 API:

[Authorize]
[HttpGet("protected")]
public IActionResult GetProtectedData()
{
    return Ok(new { message = "This is a protected resource" });
}

只有持有有效 JWT 的用户才能访问这个 API。


7. 解析 JWT

在需要解析 JWT 的场景中,可以通过 JwtSecurityTokenHandler 类来验证和解析 token。

示例:解析 JWT

public static ClaimsPrincipal ValidateToken(string token)
{
    var tokenHandler = new JwtSecurityTokenHandler();
    var key = Encoding.UTF8.GetBytes("your-256-bit-secret");

    try
    {
        var principal = tokenHandler.ValidateToken(token, new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = "yourdomain.com",
            ValidAudience = "yourdomain.com",
            IssuerSigningKey = new SymmetricSecurityKey(key)
        }, out SecurityToken validatedToken);

        return principal;
    }
    catch (Exception)
    {
        return null;  // 验证失败,返回 null
    }
}

该方法会验证 JWT 的签名、发行者、受众和过期时间等信息,确保 token 的有效性。


8. 总结

在本文中,我们介绍了如何在 .NET 中使用 JWT 进行身份验证和授权。以下是主要步骤:

  1. 生成 JWT:通过设置声明、签名密钥等信息生成 JWT。
  2. 验证 JWT:在 API 中配置 JWT Bearer 认证中间件,确保请求者的身份。
  3. 授权:通过 [Authorize] 特性来保护需要身份验证的资源。
  4. 解析 JWT:验证和解析 JWT,获取其中的声明信息。

JWT 是实现现代 Web 应用程序中身份验证和授权的有效方案,特别适用于基于 token 的认证机制,如 OAuth 2.0 和 OpenID Connect。通过上述方法,您可以在 .NET 环境中轻松集成 JWT 认证和授权功能,确保您的 API 安全可靠。

标签:验证,JWT,身份验证,token,new,NET
From: https://www.cnblogs.com/forges/p/18676570

相关文章

  • 在线客服系统 QPS 突破 240/秒,连接数突破 4000,日请求数接近1000万次,.NET 多线程技术的
    背景我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今的QPS突破240次/秒,连接数突破4000,日请求数接近1000万。(PS:阿里云真贵啊)在这篇文章中,我将简要介绍我在技术上做了哪些工作,我是如何做到的。PS:虽......
  • 实现基于CODESYS的PROFINET设备
    废话不多说,上干货。实现基于CODESYS的PROFINET设备有三步操作:导出GSD文件编程平台项目添加PROFINET设备运行时进行配置导出PROFINET设备的GSD文件当CODESYS作为PN从站时,GSDXML设备描述文件可以从设备管理器的Fieldbuses->ProfinetIO->ProfinetIODevice下导出,默认作为一......
  • 创建一个.NET MAUI应用(二)
    开发本机跨平台.NET多平台应用UI(.NETMAUI)应用需要VisualStudio202217.12或更高版本 安装若要创建.NETMAUI应用,需要下载最新版本的VisualStudio2022:下载VisualStudio2022社区版下载VisualStudio2022专业版下载VisualStudio2022企业......
  • .NET 项目如何管理资源及配置文件
    .NET项目如何管理资源及配置文件_哔哩哔哩.NET项目的资源及配置文件(视频中的思维导图)本文为以上视频的笔记......
  • 【取证工具】Magnet AXIOM中文绿色版(更新8.4)
    MagnetAXIOM取证工具介绍MagnetAXIOM是一款功能强大的数字取证工具,专为法律执行人员、调查员和安全专家设计,用于从各种数字设备中提取、分析和报告证据。AXIOM提供了全面的取证支持,能够从电脑、移动设备、云端服务以及物联网设备中收集并分析数据。多平台支持MagnetAXIOM......
  • Telnet在Windows和Linux上的使用方法
    Telnet是一个基于TCP/IP协议的远程登录协议,用于在网络上的计算机之间进行通信。它主要用于远程管理和测试网络服务。本文将详细介绍在Windows和Linux系统上如何安装和使用Telnet。一、在Windows上使用Telnet1.1启用Telnet客户端在Windows系统中,默认情况下Telnet客户端是未启用......
  • .Net的AppDomain
     一、AppDomain的作用 AppDomain(应用程序域)是一种在.NET中提供的隔离机制,用于将应用程序的不同部分隔离开来,以提高安全性、可靠性和可管理性。以下是其主要的功能和用途: 隔离性:允许在一个进程中运行多个应用程序,同时使它们相互隔离。这样可以避免一个应用程序中的错......
  • Asp .Net Core 实现微服务:集成 Ocelot+Consul+Swagger+Cors实现网关、服务注册、服务
    什么是Ocelot?Ocelot是一个开源的ASP.NETCore微服务网关,它提供了API网关所需的所有功能,如路由、认证、限流、监控等。Ocelot是一个简单、灵活且功能强大的API网关,它可以与现有的服务集成,并帮助您保护、监控和扩展您的微服务。以下是Ocelot的一些主要功能:路由管理:Ocelot允......
  • Asp .Net Core 实现微服务:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、服务发
    什么是Ocelot?Ocelot是一个开源的ASP.NETCore微服务网关,它提供了API网关所需的所有功能,如路由、认证、限流、监控等。Ocelot是一个简单、灵活且功能强大的API网关,它可以与现有的服务集成,并帮助您保护、监控和扩展您的微服务。以下是Ocelot的一些主要功能:路由管理:Ocelot......
  • Asp .Net Core实现微服务:集成 Consul 实现 服务注册与健康检查
    什么是Consul?官网:ConsulbyHashiCorpConsul是一款开源的服务发现和配置管理工具,它能够监控应用程序和服务之间的通信,并提供了一组API和WebUI,用于管理服务和配置。Consul是分布式的、高可用的、可横向扩展的,具备以下特性:服务发现:Consul通过DNS或者HTTP接口使......