• .NET CORE WebAPI JWT身份验证


    一、appsettings.Json文件配置

           配置JWT公用参数。

           

    1 /*JWT设置*/
    2 "JwtSetting": {
    3    "Issuer": "http://www.xxxx.cn:8080/", //颁发者
    4     "Audience": "http://www.xxxx.cn:8080/", //可以给哪些客户端使用
    5     "SecretKey": "8B6E0B32BE822E4144315F05E7825150" //秘钥
    6   },
    appsettings参数配置

     二、JWTHelper自定义服务类

            这部分代码主要是为了生存Token,以及解析加密的当前接口调用用户id

           

     1 public class JWTService
     2     {
     3         #region 依赖注入
     4         private readonly IConfiguration _configuration;
     5 
     6         public JWTService(IConfiguration configuration)
     7         {
     8             _configuration = configuration;
     9         }
    10         #endregion
    11 
    12         #region 方法
    13         /// <summary>
    14         /// 获取UserId
    15         /// </summary>
    16         /// <param name="UserId"></param>
    17         /// <returns></returns>
    18         public string GetToken(string UserId)
    19         {
    20             //相关Token的常量
    21             var claims = new[]
    22             {
    23                 new Claim(ClaimTypes.SerialNumber, UserId)
    24             };
    25 
    26             var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JwtSetting:SecretKey"]));
    27             var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    28 
    29             //JWT规定的部分字段
    30             var token = new JwtSecurityToken(
    31                 issuer: _configuration["JwtSetting:Issuer"],//提供者
    32                 audience: _configuration["JwtSetting:Audience"],//被授权者
    33                 claims: claims,
    34                 expires: DateTime.Now.AddHours(24),//过期时间
    35                 signingCredentials: creds
    36             );
    37 
    38             string Token = new JwtSecurityTokenHandler().WriteToken(token);
    39             return Token;
    40         }
    41 
    42         /// <summary>
    43         /// 获取当前登录用户ID
    44         /// </summary>
    45         /// <param name="User"></param>
    46         /// <returns></returns>
    47         public string GetCurrentUserId(ClaimsPrincipal User)
    48         {
    49             return User.Claims.SingleOrDefault(t => t.Type == ClaimTypes.SerialNumber).Value;
    50         }
    51         #endregion
    52     }
    JWT帮助类

    三、Startup配置        

     1 #region JWT配置
     2             services.AddAuthentication(options => {
     3                  //认证middleware配置
     4                  options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
     5                  options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
     6             })
     7             .AddJwtBearer(options => {
     8                 //主要是jwt  token参数设置
     9                 options.TokenValidationParameters = new TokenValidationParameters {
    10                     //颁发者
    11                     ValidateIssuer = true,
    12                     ValidIssuer = Configuration["JwtSetting:Issuer"],
    13                     //被授权者
    14                     ValidateAudience = true,
    15                     ValidAudience = Configuration["JwtSetting:Audience"],
    16                     //秘钥
    17                     ValidateIssuerSigningKey = true,
    18                     IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtSetting:SecretKey"])),
    19                     //是否验证失效时间【使用当前时间与Token的Claims中的NotBefore和Expires对比】
    20                     ValidateLifetime = true,
    21                     ClockSkew = TimeSpan.FromMinutes(5)//允许的服务器时间偏移量【5分钟】
    22                 };                
    23             });
    24             #endregion;
    ConfigureServices配置
    1 //添加认证中间件【必须在授权前面添加】
    2 app.UseAuthentication();
    3 //添加授权中间件
    4 app.UseAuthorization();
    Configure配置
    1 #region 注册jwt中间件
    2 services.AddTransient<JWTService>();
    3 #endregion
    ConfigureServices中间件注册

    四、登录调用

          4.1、依赖注入

          

         4.2、返回给前端token

         

    五、前端处理

       前端拿到后,保存在全局参数中。

       

     六、其他接口调用

       这里一并给大家展示layui.js的两种类型请求。

       6.1、table表单

        

        6.2、普通ajax请求,注意跨域,后台接口也要设置跨域问题。

        

        6.3、请求头展示

        

     6.4、后台方法

             

     6.5、之后拿到验证返回标志和查询请求接口用户id,这里的User是 ClaimsPrincipal里面的User,,这里的User.Identity.IsAuthenticated是bool类型的,成功是返回true,失败返回false,但是要想知道具体是权限不够还是请求时间超时,

             我还没有办法分解处理,有办法的大佬可以评论或者私信我,万分感激。之后返回给前端,前端拿到返回的401,就返回登录页面,就可以了。希望对大家有帮助。

            

  • 相关阅读:
    myeclipse自动生成相应对象接收返回值的快捷键
    JavaEE学习记录(一)--软件系统体系结构
    通过Java编码获取String分行字符串的内容
    长款或短款的处理(二)
    现金清查中的长款短款的简单解释(一)
    mybatis 的mapper配置文件sql语句中, 有时用到 大于, 小于等等
    <c:forEach items="${list}" var="tt" varStatus="status"> 的相关大小长度
    svn 提交 working copy is not up-to-date
    svn: Working copy 'D:workspaceweb....images' is too old (format 10, created by Subversion 1.6
    mybatis generator eclipse插件的安装
  • 原文地址:https://www.cnblogs.com/xiaobaicai12138/p/13255295.html
Copyright © 2020-2023  润新知