翼度科技»论坛 编程开发 .net 查看内容

.Net Core5 JWT的使用

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
首先需要安装的NuGet包有:
Microsoft.AspNetCore.Authentication.JwtBearer
Swashbuckle.AspNetCore
Swashbuckle.AspNetCore.Filters
jose-jwt
大致是这些代码放到项目中如果有报错信息再去具体解决安装需要的NuGet包。
首先需要在Startup.cs文件中的ConfigureServices方法中添加的代码有
  1. services.AddSwaggerGen(options =>
  2.             {
  3.                 //开启权限锁
  4.                 options.OperationFilter<AddResponseHeadersFilter>();
  5.                 options.OperationFilter<AppendAuthorizeToSummaryOperationFilter>();
  6.                 options.OperationFilter<SecurityRequirementsOperationFilter>();
  7.                 //在header中添加token,传递到后台
  8.                 options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
  9.                 {
  10.                     Description = "JWT授权(数据将在请求头中进行传递)直接在下面框中输入Bearer {token}(注意两者之间是一个空格) "",
  11.                     Name = "Authorization",//jwt默认的参数名称
  12.                     In = ParameterLocation.Header,//jwt默认存放Authorization信息的位置(请求头中)
  13.                     Type = SecuritySchemeType.ApiKey
  14.                 });
  15.             });
复制代码
  1. //认证方案
  2.             services.AddAuthentication(option => {
  3.                 option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
  4.                 option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
  5.             }).AddJwtBearer(
  6.                 option => {
  7.                     option.TokenValidationParameters = new TokenValidationParameters
  8.                     {
  9.                         //是否验证发行人
  10.                         ValidateIssuer = true,
  11.                         ValidIssuer = Configuration["JwtConfig:Issuer"],//发行人
  12.                         //是否验证受众人
  13.                         ValidateAudience = true,
  14.                         ValidAudience = Configuration["JwtConfig:Audience"],//受众人
  15.                         //是否验证密钥
  16.                         ValidateIssuerSigningKey = true,
  17.                         IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtConfig:key"])),
  18.                         ValidateLifetime = true, //验证生命周期
  19.                         RequireExpirationTime = true, //过期时间
  20.                         ClockSkew = TimeSpan.Zero   //平滑过期偏移时间
  21.                     };
  22.                 }
  23.             );
复制代码
接着在Configure方法中开启两个中间件
  1. //认证中间件
  2. app.UseAuthentication();
  3. //授权中间件
  4. app.UseAuthorization();
复制代码
然后在appsettings.json中加入以下配置
  1. "JwtConfig": {
  2.     "key": "JWTStudyWebsite_DI20DXU3",
  3.     "Issuer": "testJwt",
  4.     "Audience": "wlw"
  5.   },
复制代码
去使用一个简单的登录去测试JWT是否可以生成
  1. /// <summary>
  2.         /// 登录
  3.         /// </summary>
  4.         /// <param name="dto"></param>
  5.         /// <returns></returns>
  6.         public async Task<ResultDto> LoginAsync(LoginDto dto)
  7.         {
  8.             var uData = await _baseRepository.FindAsync(x => x.UserName == dto.UserName);
  9.             if (uData == null)
  10.             {
  11.                 return new ResultDto
  12.                 {
  13.                     Result = Result.Failure,
  14.                     Message = "未找到此用户!"
  15.                 };
  16.             }
  17.             else
  18.             {
  19.                 if (uData.Password.ToUpper() == dto.Password.Md5().ToUpper())
  20.                 {
  21.                     var roleIds = _baseadminRoleResRepository.Queryable().Where(x => x.AdminId == uData.AdminId).Select(m=>m.RoleId).ToList();
  22.                     //身份信息认证
  23.                     //Session或Cookies换成JWT
  24.                     IList<Claim> claims = new List<Claim> {
  25.                         new Claim(JwtClaimTypes.Id,uData.AdminId.ToString()),
  26.                         new Claim(JwtClaimTypes.Name,uData.UserName),
  27.                         new Claim(ClaimTypes.Name,uData.UserName),
  28.                         new Claim(ClaimTypes.Role,string.Join(',',roleIds))
  29.                     };
  30.                     //JWT密钥
  31.                     var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["JwtConfig:key"]));
  32.                     //算法
  33.                     var cred = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
  34.                     //过期时间
  35.                     DateTime expires = DateTime.UtcNow.AddMinutes(30);
  36.                     //Payload负载
  37.                     var token = new JwtSecurityToken(
  38.                         issuer: configuration["JwtConfig:Issuer"],
  39.                         audience: configuration["JwtConfig:Audience"],
  40.                         claims: claims,
  41.                         notBefore: DateTime.UtcNow,
  42.                         expires: expires,
  43.                         signingCredentials: cred
  44.                         );
  45.                     var handler = new JwtSecurityTokenHandler();
  46.                     //生成令牌
  47.                     string jwt = handler.WriteToken(token);
  48.                     return new ResultDto
  49.                     {
  50.                         Result = Result.Success,
  51.                         Message = "登录成功",
  52.                         Token = jwt,
  53.                     };
  54.                 }
  55.                 else
  56.                 {
  57.                     return new ResultDto
  58.                     {
  59.                         Result = Result.Failure,
  60.                         Message = "密码错误!"
  61.                     };
  62.                 }
  63.             }
  64.         }
复制代码
如果代码中的有报错的地方是需要引用一个NuGet包:IdentityModel

最后就可以生成Token了。

来源:https://www.cnblogs.com/zkmblog/archive/2023/09/13/17700471.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具