JWT认证和授权

1.JWT的组成部分
A.头部(Header):它包含了token的类型,即JWT,以及用于生成签名的算法信息,例如HMAC SHA256或RSA。在JWT中,头部通常是一个JSON 对象,例如 { "alg": "HS256", "typ": "JWT" }。
B.载荷(Payload):这部分包含了声明(Claim),也就是一些关于实体的陈述,如主题、发行者、过期时间等。这些声明可以包括标准的和自定义的字段,例如 { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 },其中 sub 表示主题,name 是名称,iat 代表令牌颁发时间。
C.签名(Signature):它是用于保证消息完整性和真实性的部分。签名是对头部和载荷使用密钥进行加密的结果。例如,若使用 HMACSHA256 算法,那么签名将是对前两部分 Base64Url 编码后的字符串与密钥进行 HMACSHA256 运算后得到的结果。

2.jwt鉴权授权流程
第一步:鉴权服务器,用户提供账户信息,服务器通过该信息进行验证该身份是否合法,确认合法会返回一个tooken信息,以便后续授权操作
第二步:授权服务器,鉴权通过后用户像系统发送一个资源请求(将tooken信息放在请求头Authorization中作为请求参数的一部分发送给服务器),根据用户的身份和权限信息判断该用户是否有权访问该资源

3.开发步骤
A.appsetting.cs中配置如下:JWTTokenOptions

B.添加jwt工具类如下:
获取配置信息+生成tooken需要引入如下:

tooken获取类如下:

点击查看代码
public class CustomJWTService : ICustomJWTService
    {
        private readonly JWTTokenOptions _JWTTokenOptions;
        /// <summary>
        ///  
        /// </summary>
        /// <param name="jwtTokenOptions"></param>
        public CustomJWTService(IOptionsMonitor<JWTTokenOptions> jwtTokenOptions)
        {
            _JWTTokenOptions = jwtTokenOptions.CurrentValue;
        }
        /// <summary>
        /// 获取token
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public string GetToken(UserRes user)
        {
            #region 有效载荷:尽量避免敏感信息,可以添加需要的信息
            var claims = new[]
            {
                new Claim("Id",user.Id.ToString()),
                new Claim("NickName",user.NickName),
                new Claim("UserName",user.UserName),
            };

            //需要加密:需要加密key:
            //Nuget引入:Microsoft.IdentityModel.Tokens
            SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_JWTTokenOptions.SecurityKey));
            //秘钥通过加密算法生成凭证
            SigningCredentials creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

            //Nuget引入:System.IdentityModel.Tokens.Jwt
            JwtSecurityToken token = new JwtSecurityToken(
             issuer: _JWTTokenOptions.Issuer,
             audience: _JWTTokenOptions.Audience,
             claims: claims,
             expires: DateTime.Now.AddMinutes(10),//10分钟有效期
             signingCredentials: creds);

            string returnToken = new JwtSecurityTokenHandler().WriteToken(token);
            return returnToken;
            #endregion
        }
    }
C.startup.cs中添加鉴权注册
点击查看代码
//第一步,注册JWT
            builder.Services.Configure<JWTTokenOptions>(builder.Configuration.GetSection("JWTTokenOptions"));
            #region JWT校验
            //第二步,增加鉴权逻辑
            JWTTokenOptions tokenOptions = new JWTTokenOptions();
            builder.Configuration.Bind("JWTTokenOptions", tokenOptions);
            builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)//Scheme
             .AddJwtBearer(options =>  //这里是配置的鉴权的逻辑
             {
                 options.TokenValidationParameters = new TokenValidationParameters
                 {
                     //JWT有一些默认的属性,就是给鉴权时就可以筛选了
                     ValidateIssuer = true,//是否验证Issuer
                     ValidateAudience = true,//是否验证Audience
                     ValidateLifetime = true,//是否验证失效时间
                     ValidateIssuerSigningKey = true,//是否验证SecurityKey
                     ValidAudience = tokenOptions.Audience,//
                     ValidIssuer = tokenOptions.Issuer,//Issuer,这两项和前面签发jwt的设置一致
                     IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(tokenOptions.SecurityKey))//拿到SecurityKey 
                 };
             });
            #endregion
D.鉴权授权的使用
点击查看代码
            app.UseAuthentication();//鉴权
            app.UseAuthorization();//授权
E.调试

Apifox请求,请求头中添加参数Authorization,value=bearer+空格+tooken值(API种获取头部信息)

F.实现授权
在需要授权的控制器或者方法上添加[Authorize]特性标记,控制器标记当前控制器下所有方法,如果只是某个方法需要授权就标记在方法上面

4.swaggerUI添加自定义的tooken验证

点击查看代码
            //swagger设置
            builder.Services.AddSwaggerGen(options =>
            {
                //版本设置
                options.SwaggerDoc("v1", new OpenApiInfo
                {
                    Version = "v1",
                    Title = "接口文档"
                });
                options.DocumentFilter<DefaultHttpMethodFilter>();
                options.ResolveConflictingActions(des =>
                {
                    return des.First();
                });
                options.DocInclusionPredicate((name, api) => api.HttpMethod != null);

                #region  swaggerUI添加自定义的tooken验证
                options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
                {
                    Description = "请设置Token",
                    Name = "Authorization",
                    In = ParameterLocation.Header,
                    Type = SecuritySchemeType.ApiKey
                });
                options.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                    {
                        new OpenApiSecurityScheme
                        {
                            Reference = new OpenApiReference()
                            {
                                Id = "Bearer",
                                Type = ReferenceType.SecurityScheme
                            }
                        },
                        Array.Empty<string>()
                    }
                });
                #endregion
每个接口最右侧都会有一个加锁按钮,可以设置tooken


设置如下:

posted @   浮生若梦cmr  阅读(172)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示