翼度科技»论坛 云主机 LINUX 查看内容

WebApi中添加Jwt鉴权

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
前言

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息。一个 JWT 实际上就是一个字符串,它由三部分组成,头部、载荷与签名。前两部分需要经过 Base64 编码,后一部分通过前两部分 Base64 编码后再加密而成。针对前后端分离的项目,大多是通过 token 进行身份认证来进行交互,今天将介绍一种简单的创建 和验证token 的方式 。

项目介绍

项目框架:.NET Core 3.1
项目依赖:

  • Swashbuckle.AspNetCore
  • JWT
项目架构:

项目核心代码

JWT帮助类
  1.   /// <summary>
  2.     /// JWT获取和验证帮助类
  3.     /// </summary>
  4.     public class JwtHelper
  5.     {
  6.         /// <summary>
  7.         /// 日志
  8.         /// </summary>
  9.        private static Logger  _logger = new Logger();
  10.         /// <summary>
  11.         /// 私钥appsettings.json中配置
  12.         /// </summary>
  13.         private static string secret =  ConfigHelper.GetSectionValue("TokenSecret");
  14.         /// <summary>
  15.         /// 生成JwtToken
  16.         /// </summary>
  17.         /// <param name="payload">不敏感的用户数据</param>
  18.         /// <returns></returns>
  19.         public static string SetJwtEncode(Dictionary<string, object> payload)
  20.         {
  21.             try
  22.             {
  23.                 IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
  24.                 IJsonSerializer serializer = new JsonNetSerializer();
  25.                 IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
  26.                 IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
  27.                 var token = encoder.Encode(payload, secret);
  28.                 return token;
  29.             }
  30.             catch (System.Exception ex)
  31.             {
  32.                 _logger.Error(ex.Message);
  33.                 return null;
  34.             }
  35.         }
  36.         /// <summary>
  37.         /// 根据jwtToken获取实体
  38.         /// </summary>
  39.         /// <param name="token">jwtToken</param>
  40.         /// <returns></returns>
  41.         public static LoginUserInfo GetJwtDecode(string token)
  42.         {
  43.             try
  44.             {
  45.                 IJsonSerializer serializer = new JsonNetSerializer();
  46.                 IDateTimeProvider provider = new UtcDateTimeProvider();
  47.                 IJwtValidator validator = new JwtValidator(serializer, provider);
  48.                 IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
  49.                 IJwtDecoder decoder = new JwtDecoder(serializer, urlEncoder);
  50.                 //IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);
  51.                 var userInfo = decoder.DecodeToObject<LoginUserInfo>(token, secret, verify: true);//token为之前生成的字符串
  52.                 return userInfo;
  53.             }
  54.             catch (System.Exception ex)
  55.             {
  56.                 _logger.Error(ex.Message);
  57.                 return null;
  58.             }
  59.         }
  60.     }
复制代码
过滤器Filter
  1. /// <summary>
  2.     /// 授权认证
  3.     /// </summary>
  4.     public class AuthorizeFilter : Attribute, IActionFilter
  5.     {
  6.         public void OnActionExecuted(ActionExecutedContext context)
  7.         {
  8.         }
  9.         public void OnActionExecuting(ActionExecutingContext context)
  10.         {
  11.             var controller = context.RouteData.Values["controller"].ToString();
  12.             //var action = context.RouteData.Values["action"].ToString();
  13.             if (controller == "User" || controller == "Jwt")
  14.             {
  15.                 //登录接口不验证
  16.             }
  17.             else
  18.             {
  19.                 var authHeader = context.HttpContext.Request.Headers["Authorization"];
  20.                 if (string.IsNullOrWhiteSpace(authHeader))
  21.                 {
  22.                     //此接口必须携带token访问!
  23.                     context.Result = new JsonResult(new OperationResult(OperationResultType.Error, "此接口必须携带token访问,请登录携带Token访问"));
  24.                 }
  25.                 else //字段值不为空
  26.                 {
  27.                     authHeader = authHeader.ToString().Replace("Bearer", "").Trim();//去掉Bearer字串
  28.                     if (authHeader == "")
  29.                     {
  30.                         context.Result = new JsonResult(new OperationResult(OperationResultType.Error, "token验证失败:您没有权限调用此接口,请登录重新获取Token"));
  31.                     }
  32.                     else
  33.                     {
  34.                         LoginUserInfo LoginInfo = JwtHelper.GetJwtDecode(authHeader);
  35.                         if (LoginInfo != null)
  36.                         {
  37.                             context.Result = new JsonResult(new OperationResult(OperationResultType.Error, "Token验证失败"));
  38.                         }
  39.                         string UserName = LoginInfo.username;
  40.                         string PassWord = LoginInfo.pwd;
  41.                         string ExpireTimeStamp = LoginInfo.exp;
  42.                         //var cacheToken = Cache.Get(UserName);
  43.                         if (isTokenExpire(ExpireTimeStamp)) //这里应该验证有效期
  44.                         {
  45.                             context.Result = new JsonResult(new OperationResult(OperationResultType.Error, "token验证失败:您没有权限调用此接口,请登录重新获取Token"));
  46.                         }
  47.                     }
  48.                 }
  49.             }
  50.         }
  51.         /// <summary>
  52.         /// 时间戳字符串
  53.         /// </summary>
  54.         /// <param name="timestampstr"></param>
  55.         /// <returns></returns>
  56.         private bool isTokenExpire(string timestampstr)
  57.         {
  58.             try
  59.             {
  60.                 double timestamp = double.Parse(timestampstr);
  61.                 System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));//当地时区
  62.                 var expireTime = startTime.AddSeconds(timestamp);
  63.                 if (expireTime > DateTime.Now)
  64.                 {
  65.                     return false;//未过期
  66.                 }
  67.                 else
  68.                 {
  69.                     return true;//已过期
  70.                 }
  71.             }
  72.             catch (Exception ex)
  73.             {
  74.                 return true;
  75.             }
  76.         }
  77.     }
复制代码
测试验证

Swagger页面

登录获取Token

未携带token访问接口

源码获取

关注公众号,后台回复关键字:JwtApiDemo

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

本帖子中包含更多资源

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

x

举报 回复 使用道具