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

使用WebApi+Vue3从0到1搭建《权限管理系统》:二、搭建JWT系统鉴权

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
视频地址:【WebApi+Vue3从0到1搭建《权限管理系统》系列视频:搭建JWT系统鉴权-哔哩哔哩】 https://b23.tv/R6cOcDO
qq群:801913255
一、在appsettings.json中设置鉴权属性
  1. /*jwt鉴权*/
  2. "JwtSetting": {
  3.    "Issuer": "zhangsan", //发行人
  4.    "Audience": "zhangsan", //订阅人
  5.    "ExpireSeconds": 120, //过期时间,默认分钟
  6.    "ENAlgorithm": "HS256", //秘钥算法
  7.    "SecurityKey": "Zmz=Start2024013OverallAuth.WebApi" //秘钥构成
  8. },
复制代码
二、新建模型
添加模型JwtSettingModel其中字段和appsettings.json中的字段一样,如下
  1. /// <summary>
  2. /// jwt 配置模型
  3. /// </summary>
  4. public class JwtSettingModel
  5. {
  6.     /// <summary>
  7.     /// 发行人
  8.     /// </summary>
  9.     public string Issuer { get; set; }
  10.     /// <summary>
  11.     /// 订阅人
  12.     /// </summary>
  13.     public string Audience { get; set; }
  14.     /// <summary>
  15.     /// 过期时间,默认分钟
  16.     /// </summary>
  17.     public int  ExpireSeconds { get; set; }
  18.     /// <summary>
  19.     /// 秘钥算法
  20.     /// </summary>
  21.     public string ENAlgorithm { get; set; }
  22.     /// <summary>
  23.     /// 秘钥构成
  24.     /// </summary>
  25.     public string SecurityKey { get; set; }
  26. }
复制代码
三、新建解析appsettings.json节点的帮助类
  1. /// <summary>
  2. /// 配置文件解析帮助类
  3. /// </summary>
  4. public class ConfigurationHelper
  5. {
  6.      /// <summary>
  7.      /// 配置项
  8.      /// </summary>
  9.      public static IConfiguration configuration { get; set; }
  10.      /// <summary>
  11.      /// 构造实例化
  12.      /// </summary>
  13.      static ConfigurationHelper()
  14.      {
  15.          configuration = new ConfigurationBuilder().Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true }).Build();
  16.      }
  17.      /// <summary>
  18.      /// 获取appsetings 配置节点
  19.      /// </summary>
  20.      /// <typeparam name="T"></typeparam>
  21.      /// <param name="node"></param>
  22.      /// <returns></returns>
  23.      public static T GetNode<T>(string node) where T : new()
  24.      {
  25.          T mode = configuration.GetSection(node).Get<T>();
  26.          return mode;
  27.      }
  28. }
复制代码
四、在Startup.cs编写鉴权代码
找到ConfigureServices方法,在方法中添加如下代码
  1. //添加jwt鉴权
  2. services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, option =>
  3. {
  4.      var jwtsetting = ConfigurationHelper.GetNode<JwtSettingModel>("JwtSetting");
  5.      Configuration.Bind("JwtSetting", jwtsetting);
  6.      option.SaveToken = true;
  7.      option.TokenValidationParameters = new TokenValidationParameters()
  8.      {
  9.          ValidIssuer = jwtsetting.Issuer,//发行人
  10.          ValidAudience = jwtsetting.Audience,//订阅人
  11.          IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtsetting.SecurityKey)),//解密的密钥
  12.          ValidateIssuerSigningKey = true,//是否验证签名,不验证的画可以篡改数据,不安全
  13.          ValidateIssuer = true,//是否验证发行人,就是验证载荷中的Iss是否对应ValidIssuer参数
  14.          ValidateAudience = true,//是否验证订阅人,就是验证载荷中的Aud是否对应ValidAudience参数
  15.          ValidateLifetime = true,//是否验证过期时间,过期了就拒绝访问
  16.          ClockSkew = TimeSpan.Zero,//这个是token缓冲过期时间,如果设置了,token过期时间就是缓冲时间+过期时间
  17.          //RequireExpirationTime = true,
  18.      };
  19. });
复制代码
并在Configure方法中添加jwt授权代码 app.UseAuthorization();
五、编写Jwt帮助类
  1. /// <summary>
  2. /// jwt帮助类
  3. /// </summary>
  4. public static class JwtHelper
  5. {
  6.     /// <summary>
  7.     /// 生成token
  8.     /// </summary>
  9.     /// <param name="loginResult"></param>
  10.     /// <returns></returns>
  11.     public static string BuildToken(LoginModel loginResult)
  12.     {
  13.         LoginModel result = new();
  14.         var jwtsetting = ConfigurationHelper.GetNode<JwtSettingModel>("JwtSetting");
  15.         //获取登录信息
  16.         var calime = loginResult.PropValueType().Select(x => new Claim(x.Name, x.Value.ToString(), x.Type)).ToList();
  17.         //记录登录信息
  18.         var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtsetting.SecurityKey));
  19.         var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
  20.         var header = new JwtHeader(creds);
  21.         var paylod = new JwtPayload(jwtsetting.Issuer, jwtsetting.Audience, calime, DateTime.Now, DateTime.Now.AddMinutes(jwtsetting.ExpireSeconds));
  22.         //正式创建令牌
  23.         var token = new JwtSecurityToken(header, paylod);
  24.         var tokenStr = new JwtSecurityTokenHandler().WriteToken(token);
  25.         var  ddd = token.ValidTo.AddHours(8).ToString();
  26.         return tokenStr;
  27.     }
  28.     /// <summary>
  29.     /// 反射获取字段信息
  30.     /// </summary>
  31.     /// <param name="obj">模型</param>
  32.     /// <returns></returns>
  33.     public static IEnumerable<(string Name, object Value, string Type)> PropValueType(this object obj)
  34.     {
  35.         List<(string a, object b, string c)> result = new();
  36.         var type = obj.GetType();
  37.         var props = type.GetProperties();
  38.         foreach (var item in props)
  39.         {
  40.             result.Add((item.Name, item.GetValue(obj), item.PropertyType.Name));
  41.         }
  42.         return result;
  43.     }
  44. }
复制代码
然后再webapi接口控制器上方添加鉴权特性[Authorize],这样所有接口都会遵守jwt鉴权协议
 
六、Swagger接口文档使用Jwt鉴权
做好以上五点,webapi中就能正常使用jwt鉴权,但如果你使用Swagger测试接口,那么就要让Swagger遵守Jwt协议
所以必须在添加以下代码,注意这段代码是写在AddSwaggerGen中
  1. //把jwt添加到swagger中
  2. optinos.AddSecurityDefinition("OverallAuth.WebApi", new OpenApiSecurityScheme
  3. {
  4.      Description = "直接在下框中输入Bearer token(注意两者之间是一个空格)",
  5.      Name = "Authorization",//jwt默认的参数名称
  6.      In = ParameterLocation.Header,//jwt默认存放请求头中
  7.      Type = SecuritySchemeType.ApiKey
  8. });
  9. //swagger遵守jwt授权协议
  10. optinos.AddSecurityRequirement(new OpenApiSecurityRequirement
  11.      {
  12.         {
  13.              new OpenApiSecurityScheme{
  14.                  Reference = new OpenApiReference {
  15.                              Type = ReferenceType.SecurityScheme,
  16.                              Id = "OverallAuth.WebApi"
  17.                  }
  18.             },new string[] { }
  19.          }
  20.      });
复制代码

以上就是在webapi中使用jwt的详细代码
 

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

本帖子中包含更多资源

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

x
来自手机

举报 回复 使用道具