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

在ASP.NET Core中轻松使用JwtBeare进行身份验证

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
JwtBearer简介
首先要搞清楚什么是JwtBearer,JwtBearer是ASP.NET Core的OAuth 2.0 JWT Bearer身份验证提供程序。它提供了对JWT令牌进行验证的功能,然后允许将令牌中包含的声明(claims)用于用户身份验证和授权控制。
Json Web Token (JWT)是一种Web标准,用于在不同系统间传输数据。JWT是一种可验证的和安全的方式,用于在各种应用程序之间传递信息。JWT具有一定的安全性,因为它是通过密钥对JWT进行签名的,以确保意味着不能进行篡改或伪造。
JWT由三个部分组成,分别为:“Header”、“Payload”和“Signature” 。其中,“header”表示JWT的元数据(元信息),用于描述加密信息和算法;“payload”表示JWT的指令部分,用于承载用户状态或授权相关的信息;“signature”表示JWT的签名信息,用于验证JWT的有效性。
JwtBearer首先使用“header”中声明的算法对JWT进行身份验证,以确保其未被篡改。然后,它将使用密钥根据“payload”中的信息生成令牌,以在用户请求中将其传递。
JwtBearer提供了配置选项,以允许您使用自定义的密钥和算法生成和验证JWT令牌。它还允许您配置应用程序特定的声明,以在用户的身份验证和授权管理中使用。
在.NET Core中使用
1)、首先新建一个APS.NET Core项目,然后在项目中添加JwtBearer包,可以用nuget包管理器添加,也可以使用nuget命令添加,命令如下:
  1. dotnet add package  Microsoft.AspNetCore.Authentication.JwtBearer
复制代码
2)新建一个JwtConfig类,用了存储token相关数据。
  1. public class JwtConfig
  2.     {
  3.         public string Key { get; set; } //key
  4.         public int Expres { get; set; } //过期时间(单位秒)
  5.         public string Issuer { get; set; }
  6.         public string Audience { get; set; }
  7.     }
复制代码
3)、在appsettings.json中配置jwt密钥
  1. //配置文件appsettings.json
  2. {
  3.   "Logging": {
  4.     "LogLevel": {
  5.       "Default": "Information",
  6.       "Microsoft.AspNetCore": "Warning"
  7.     }
  8.   },
  9.   "AllowedHosts": "*",
  10.   //JWT的配置内容
  11.   "JWT": {//key必须有足够的长度
  12.       "Key": "asfasfdflj134aanjkdsjiio1232sdasdfdfkandsf12",
  13.     "expres": "3",
  14.      "Issuer": "https://localhost:7201",
  15.     "Audience": "https://localhost:7201",
  16.   }
  17. }
复制代码
4)在program.cs文件注入JwtBearer
  1. //注入配置类
  2. builder.Services.Configure<JwtConfig>(builder.Configuration.GetSection("JWT"));
复制代码
5)新建一个类,专门创建token
  1. //依赖注入
  2.   private readonly IOptionsSnapshot<JwtConfig> jwtconfig;
  3.   public Demo3Controller(IOptionsSnapshot<JwtConfig> jwtconfig)
  4.   {
  5.      this.jwtconfig = jwtconfig;
  6.   }
  7. public string CreateToken()
  8. {
  9.     // 创建声明列表,即 Token 中携带的信息
  10.     List<Claim> claims = new List<Claim>();
  11.     claims.Add(new Claim(ClaimTypes.Name, "admin")); // 添加用户名
  12.     claims.Add(new Claim(ClaimTypes.NameIdentifier, "1080")); // 添加用户 ID
  13.     // 设置 Token 的过期时间
  14.     DateTime expres = DateTime.Now.AddSeconds(jwtconfig.Value.Expres);
  15.     Console.WriteLine($"过期时间{expres}");
  16.     // 从配置文件中获取 JWT 密钥并转换为字节数组
  17.     byte[] secbyse = Encoding.UTF8.GetBytes(jwtconfig.Value.Key);
  18.     // 创建 SymmetricSecurityKey 对象并使用 HmacSha256 算法对密钥进行签名
  19.     var secKey = new SymmetricSecurityKey(secbyse);
  20.     var credetials = new SigningCredentials(secKey, SecurityAlgorithms.HmacSha256);
  21.     // 创建 JwtSecurityToken 对象并设置声明、过期时间和签名信息
  22.     var tokenDescriptor = new JwtSecurityToken(claims: claims, expires: expres, signingCredentials: credetials);
  23.     // 生成 JWT Token 字符串并返回
  24.     string jwt = new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);
  25.     return jwt;
  26. }
复制代码
6)再在program.cs文件中验证传入的token,代码如下:
  1. builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(opt =>
  2. {
  3.     var JwtOtp = builder.Configuration.GetSection("JWT").Get<JwtConfig>();
  4.     byte[] keybase = Encoding.UTF8.GetBytes(JwtOtp.Key);
  5.     var seckey = new SymmetricSecurityKey(keybase);
  6.     opt.TokenValidationParameters = new()
  7.     {
  8.         ValidateIssuer = false,
  9.         ValidateAudience = false,
  10.         ValidateLifetime = true,
  11.         ValidateIssuerSigningKey = true,
  12.         IssuerSigningKey = seckey,
  13.     };
  14.     opt.Events = new JwtBearerEvents
  15.     {
  16.         //权限验证失败后执行
  17.         OnChallenge = context =>
  18.         {
  19.             //终止默认的返回结果
  20.             context.HandleResponse();
  21.             string token = context.Request.Headers["Authorization"];
  22.             var result = JsonConvert.SerializeObject(new { code = 401, message = "登录过期" });
  23.             if (string.IsNullOrEmpty(token))
  24.             {
  25.                 result = JsonConvert.SerializeObject(new { code = 401, message = "token不能为空" });
  26.                 context.Response.ContentType = "application/json";
  27.                 //验证失败返回401
  28.                 context.Response.StatusCode = StatusCodes.Status200OK;
  29.                 context.Response.WriteAsync(result);
  30.                 return Task.FromResult(result);
  31.             }
  32.             try
  33.             {
  34.                 JwtSecurityTokenHandler tokenheader = new();
  35.                 ClaimsPrincipal claimsPrincipal = tokenheader.ValidateToken(token, opt.TokenValidationParameters, out SecurityToken securityToken);
  36.             }
  37.             catch (SecurityTokenExpiredException)
  38.             {
  39.                 result = JsonConvert.SerializeObject(new { code = 401, message = "登录已过期" });
  40.                 context.Response.ContentType = "application/json";
  41.                 //验证失败返回401
  42.                 context.Response.StatusCode = StatusCodes.Status200OK;
  43.                 context.Response.WriteAsync(result);
  44.                 return Task.FromResult(result);
  45.             }
  46.             catch (Exception ex)
  47.             {
  48.                 Console.WriteLine(ex);
  49.                 result = JsonConvert.SerializeObject(new { code = 402, message = "token令牌无效" });
  50.                 context.Response.ContentType = "application/json";
  51.                 //验证失败返回401
  52.                 context.Response.StatusCode = StatusCodes.Status200OK;
  53.                 context.Response.WriteAsync(result);
  54.                 return Task.FromResult(result);
  55.             }
  56.             context.Response.ContentType = "application/json";
  57.             //验证失败返回401
  58.             context.Response.StatusCode = StatusCodes.Status200OK;
  59.             context.Response.WriteAsync(result);
  60.             return Task.FromResult(result);
  61.         }
  62.     };
  63. });
  64. app.UseAuthentication();//.NETCore验证中间件,必须有。并且在   app.UseAuthorization();之前
复制代码
7)、在需要权限的方法或控制器上加上特性[Authorize]
  1. [HttpGet(Name = "GetAuthorize")]
  2. [Authorize]
  3. public IEnumerable<WeatherForecast> Get()
  4. {
  5.     //doing
  6. }
复制代码
这样就完成了JwtBearer验证的代码,具体调用见下文。
调用流程如下:
1)、首先获得Token
可以通过登录验证后生成。如果是接口程序通过接口获得。
效果如下:

2)、获取Token后在请求头添加Authorization验证,并输入获得的Token,需要注意的是Token前面需要加Bearer并添加一个空格。
效果如下:

如果Token为空的效果:

注:在swagger加token需要另外在program.cs配置,代码如下:
  1. builder.Services.AddSwaggerGen(s =>
  2. {
  3.     //添加安全定义
  4.     s.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
  5.     {
  6.         Description = "请输入token,格式为 Bearer xxxxxxxx(注意中间必须有空格)",
  7.         Name = "Authorization",
  8.         In = ParameterLocation.Header,
  9.         Type = SecuritySchemeType.ApiKey,
  10.         BearerFormat = "JWT",
  11.         Scheme = "Bearer"
  12.     });
  13.     //添加安全要求
  14.     s.AddSecurityRequirement(new OpenApiSecurityRequirement {
  15.     {
  16.         new OpenApiSecurityScheme{
  17.             Reference =new OpenApiReference{
  18.                 Type = ReferenceType.SecurityScheme,
  19.                 Id ="Bearer"
  20.             }
  21.         },new string[]{ }
  22.     }
  23. });
  24. });
复制代码
添加好重启程序后会在swagger的右上方增加如下按钮,打开按钮根据提示即可完成添加。

结语
本文介绍了ASP.NET Core如使用JwtBearer,以及JwtBearer生成token验证的验证过程。希望对你有所收获,欢迎留言或吐槽。
  1. 来源公众号:DotNet开发跳槽
复制代码
来源:https://www.cnblogs.com/xbhp/archive/2023/05/15/17401507.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

x

举报 回复 使用道具