dotnet使用jwt

<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.5" />
<PackageReference Include="Microsoft.Extensions.Options" Version="7.0.1" />

 除了这几个包,如果有哪个报错,大家直接引入对应的就行,版本一般对应Net版本就行

应该还有这个:System.IdentityModel.Tokens.Jwt和System.IdentityModel.Tokens.Jwt

按照步骤无脑复制粘贴就行

第一步:配置appsetting.json文件:

内容随便写就行

"JWTTokenOptions": {
    "Audience": "你想写啥写啥",
    "Issuer": "你想写啥写啥,
    "SecurityKey": "50位左右乱序字符,不要太多也不要太少,你的秘钥"
  }

f7dbfc71c6bb48a5ad7dcfbaba6c86da.png

第二步:定义一个jwtoption类,一般在Model中创建

public class JWTTokenOptions
    {
        public string Audience
        {
            get;
            set;
        }
        public string SecurityKey
        {
            get;
            set;
        }
        public string Issuer
        {
            get;
            set;
        }
    }

第三步:定义一个jwtservice类,直接复制我的就行,都是模版,我也记不住

注意:JwtService构造函数参数一点不要写成JwtTokenOption而是IOptionMonitor<JwtTokenOption>这样才可以依赖注入,否则你需要自己配置依赖注入。一句话复制我的就可以了

namespace Service
{
    public class CustomHSJWTService: ICustomJWTService
    {
        private readonly JWTTokenOptions _JWTTokenOptions;
        public CustomHSJWTService(IOptionsMonitor<JWTTokenOptions> jwtTokenOptions)//通过依赖注入
        {
            _JWTTokenOptions = jwtTokenOptions.CurrentValue;
        }
        
        public string GetToken(UserRes user)
        {
            //jwt的第二段 
            #region 有效载荷,大家可以自己写,爱写多少写多少;尽量避免敏感信息
            var claims = new[]
            {
                    new Claim("Id",user.Id.ToString()),
                    new Claim("NickName",user.NickName),
                    new Claim("Name",user.Name),
                    new Claim("UserType",user.UserType.ToString()),
                    // new Claim(JwtRegisteredClaimNames.Sub,"xxxx")
                    // new Claim(ClaimTypes.Actor,"xxxxx"),
            };
            #endregion
            //需要加密:需要加密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);

            // var tokenDescriptor = new SecurityTokenDescriptor{}
            // new JwtSecurityTokenHandler().CreateToken();
            string returnToken = new JwtSecurityTokenHandler().WriteToken(token);
            return returnToken;
            
        }
    }
}

 这个是思路,大家不用管


 总结思路
 claim ||-> var identity = new ClaimsIdentity(claims, "jwt");
 秘钥得到字节对称加密
 生成验证规则

1.创建描述
 var tokenDescriptor = new SecurityTokenDescriptor
 {
   Subject = identity,
   Expires = DateTime.UtcNow.AddHours(1),
   SigningCredentials = signingCredentials
 };
 // 创建 token 处理器
 var tokenHandler = new JwtSecurityTokenHandler();
 // 创建 token
 var token = tokenHandler.CreateToken(tokenDescriptor);
 // 写出 token 到字符串
 var tokenString = tokenHandler.WriteToken(token);

2方案(推荐)
new JwtSecurityToken
var tokenString = tokenHandler.WriteToken(token);

第四步:

builder配置注册jwt

 
            //第一步,注册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

第五步:在program中粘贴如下代码:

// app.UseHttpsRedirection();
app.UseCors("CorsPolicy");
//鉴权授权
app.UseAuthentication();
app.UseAuthorization();

在你想要验证的控制类上粘贴  [Authorize]  ,这样你的这个Controller类内的接口都会需要jwt验证

补充跨域:(和配置jwt没关系),配置一个“corspolicy”策略

//添加跨域策略
            builder.Services.AddCors(options =>
            {
                options.AddPolicy("CorsPolicy", opt => opt.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().WithExposedHeaders("X-Pagination"));
            });

运行成功结果如图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值