【转载】C#集成JWT快速入门

一、JWT基本概念

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于在双方之间安全地传输信息作为JSON对象。这些信息可以被验证、信任,因为它们是数字签名的。JWT常用于身份验证和授权场景,特别是在微服务架构和分布式系统中。

JWT主要由三部分组成:Header(头部)、Payload(负载)和Signature(签名)。

二、JWT的生成

在C#中,我们可以使用System.IdentityModel.Tokens.Jwt命名空间下的类来生成JWT。以下是一个简单的示例:

复制代码
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;

public string GenerateJWT(string userId, string secretKey)
{
    var tokenHandler = new JwtSecurityTokenHandler();
    var key = Encoding.ASCII.GetBytes(secretKey);
    var tokenDescriptor = new SecurityTokenDescriptor
    {
        Subject = new ClaimsIdentity(new[]
        {
            new Claim(ClaimTypes.Name, userId)
            // 可以添加更多声明,如角色、权限等
        }),
        Expires = DateTime.UtcNow.AddDays(7),
        SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
    };

    var token = tokenHandler.CreateToken(tokenDescriptor);
    return tokenHandler.WriteToken(token);
}

在上述代码中,我们首先创建了一个JwtSecurityTokenHandler实例。然后,我们定义了一个SecurityTokenDescriptor,它包含了JWT的主题(即用户信息)、过期时间以及签名凭据。最后,我们使用tokenHandler生成并返回JWT。

三、JWT的验证

验证JWT主要是检查其签名是否有效,以及是否过期。这可以通过JwtSecurityTokenHandler类的ValidateToken方法实现:

复制代码
public bool ValidateJWT(string token, string secretKey, out ClaimsPrincipal principal)
{
    var tokenHandler = new JwtSecurityTokenHandler();
    var validationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey)),
        ValidateIssuer = false,
        ValidateAudience = false
    };

    SecurityToken validatedToken;
    try
    {
        principal = tokenHandler.ValidateToken(token, validationParameters, out validatedToken);
        return true;
    }
    catch (Exception)
    {
        principal = null;
        return false;
    }
}

在上述代码中,我们首先创建了一个JwtSecurityTokenHandler实例和一个TokenValidationParameters实例。TokenValidationParameters包含了验证JWT所需的所有参数,如签名密钥等。然后,我们尝试使用tokenHandler.ValidateToken方法验证JWT。如果JWT有效,该方法将返回一个ClaimsPrincipal实例,该实例包含了JWT中的所有声明;否则,将抛出异常。

四、JWT的授权

在验证了JWT之后,我们可以从ClaimsPrincipal实例中获取用户的角色或权限,并根据这些信息进行授权。这通常是在服务端进行的,可以通过检查特定的声明(如rolepermission)来实现。例如:

复制代码
if (principal.HasClaim(c => c.Type == ClaimTypes.Role && c.Value == "admin"))
{
    // 用户是管理员,允许访问受保护的资源
}
else
{
    // 用户不是管理员,拒绝访问受保护的资源
}

在上述代码中,我们首先检查ClaimsPrincipal实例是否包含一个类型为role且值为admin的声明。如果是,那么我们就认为用户是管理员,并允许其访问受保护的资源;否则,我们将拒绝其访问。

总结 :JWT提供了一种安全、灵活的方式来传输用户信息,并可以用于身份验证和授权。在C#中,我们可以使用System.IdentityModel.Tokens.Jwt命名空间下的类来生成、验证和使用JWT。

相关推荐
阿珊和她的猫3 小时前
v-scale-scree: 根据屏幕尺寸缩放内容
开发语言·前端·javascript
fouryears_234175 小时前
Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
开发语言·flutter·客户端·dart
我好喜欢你~6 小时前
C#---StopWatch类
开发语言·c#
lifallen7 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研7 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
cui__OaO8 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
鱼鱼说测试9 小时前
Jenkins+Python自动化持续集成详细教程
开发语言·servlet·php
艾莉丝努力练剑9 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
一阵没来由的风9 小时前
拒绝造轮子(C#篇)ZLG CAN卡驱动封装应用
c#·can·封装·zlg·基础封装·轮子
CHEN5_0210 小时前
【Java基础面试题】Java基础概念
java·开发语言