首页 > 其他分享 >WebApi中添加Jwt鉴权

WebApi中添加Jwt鉴权

时间:2023-09-26 09:04:40浏览次数:35  
标签:WebApi return string Jwt token context var new 鉴权

前言

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

image

项目介绍

项目框架:.NET Core 3.1

项目依赖:

  • Swashbuckle.AspNetCore

  • JWT

项目架构:

image

项目核心代码

JWT帮助类

  /// <summary>
    /// JWT获取和验证帮助类
    /// </summary>
    public class JwtHelper
    {
        /// <summary>
        /// 日志
        /// </summary>
       private static Logger  _logger = new Logger();

        /// <summary>
        /// 私钥appsettings.json中配置
        /// </summary>
        private static string secret =  ConfigHelper.GetSectionValue("TokenSecret");

        /// <summary>
        /// 生成JwtToken
        /// </summary>
        /// <param name="payload">不敏感的用户数据</param>
        /// <returns></returns>
        public static string SetJwtEncode(Dictionary<string, object> payload)
        {
            try
            {
                IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
                IJsonSerializer serializer = new JsonNetSerializer();
                IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
                IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);

                var token = encoder.Encode(payload, secret);
                return token;
            }
            catch (System.Exception ex)
            {
                _logger.Error(ex.Message);
                return null;
            }

        }

        /// <summary>
        /// 根据jwtToken获取实体
        /// </summary>
        /// <param name="token">jwtToken</param>
        /// <returns></returns>
        public static LoginUserInfo GetJwtDecode(string token)
        {
            try
            {
                IJsonSerializer serializer = new JsonNetSerializer();
                IDateTimeProvider provider = new UtcDateTimeProvider();
                IJwtValidator validator = new JwtValidator(serializer, provider);
                IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
                IJwtDecoder decoder = new JwtDecoder(serializer, urlEncoder);
                //IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);
                var userInfo = decoder.DecodeToObject<LoginUserInfo>(token, secret, verify: true);//token为之前生成的字符串
                return userInfo;
            }
            catch (System.Exception ex)
            {
                _logger.Error(ex.Message);
                return null;
            }

        }

    }

过滤器Filter

 /// <summary>
    /// 授权认证
    /// </summary>
    public class AuthorizeFilter : Attribute, IActionFilter
    {

        public void OnActionExecuted(ActionExecutedContext context)
        {

        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            var controller = context.RouteData.Values["controller"].ToString();
            //var action = context.RouteData.Values["action"].ToString();
            if (controller == "User" || controller == "Jwt")
            {
                //登录接口不验证
            }
            else
            {
                var authHeader = context.HttpContext.Request.Headers["Authorization"];
                if (string.IsNullOrWhiteSpace(authHeader))
                {
                    //此接口必须携带token访问!
                    context.Result = new JsonResult(new OperationResult(OperationResultType.Error, "此接口必须携带token访问,请登录携带Token访问"));
                }
                else //字段值不为空
                {
                    authHeader = authHeader.ToString().Replace("Bearer", "").Trim();//去掉Bearer字串
                    if (authHeader == "")
                    {
                        context.Result = new JsonResult(new OperationResult(OperationResultType.Error, "token验证失败:您没有权限调用此接口,请登录重新获取Token"));
                    }
                    else
                    {
                        LoginUserInfo LoginInfo = JwtHelper.GetJwtDecode(authHeader);
                        if (LoginInfo != null)
                        {
                            context.Result = new JsonResult(new OperationResult(OperationResultType.Error, "Token验证失败"));
                        }
                        string UserName = LoginInfo.username;
                        string PassWord = LoginInfo.pwd;
                        string ExpireTimeStamp = LoginInfo.exp;
                        //var cacheToken = Cache.Get(UserName);
                        if (isTokenExpire(ExpireTimeStamp)) //这里应该验证有效期
                        {
                            context.Result = new JsonResult(new OperationResult(OperationResultType.Error, "token验证失败:您没有权限调用此接口,请登录重新获取Token"));
                        }
                    }

                }
            }
        }

        /// <summary>
        /// 时间戳字符串
        /// </summary>
        /// <param name="timestampstr"></param>
        /// <returns></returns>
        private bool isTokenExpire(string timestampstr)
        {
            try
            {
                double timestamp = double.Parse(timestampstr);
                System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));//当地时区
                var expireTime = startTime.AddSeconds(timestamp);
                if (expireTime > DateTime.Now)
                {
                    return false;//未过期
                }
                else
                {
                    return true;//已过期
                }
            }
            catch (Exception ex)
            {
                return true;
            }
        }

    }

测试验证

Swagger页面

image

登录获取Token

image

未携带token访问接口

image

源码获取

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

标签:WebApi,return,string,Jwt,token,context,var,new,鉴权
From: https://www.cnblogs.com/wml-it/p/17728594.html

相关文章

  • Spring Security 基于 JWT Token 的接口安全控制
    现在的网站开发,基本上都是前后端分离,后端提供api接口并进行权限控制。使用SpringSecurity框架可以大大简化权限控制的代码实现。对于后端接口而言,为了能够实现多节点负载均衡部署,更好的方案是不再使用Session了,绝大多数情况下,通过提交JWTToken来进行身份认证。本篇博客......
  • 金蝶云星空自定义WebApi
     1、创建项目,命名规范:开发商.K3.SCM.WebApi.ServicesStub 2、添加引用 usingKingdee.BOS.ServiceFacade.KDServiceFx;usingKingdee.BOS.WebApi.ServicesStub;3、新建类,继承webapi业务抽象服务AbstractWebApiBusinessService。///<summary>///......
  • 关于JWT Token 自动续期的解决方案
    前言在前后端分离的开发模式下,前端用户登录成功后后端服务会给用户颁发一个jwttoken。前端(如vue)在接收到jwttoken后会将token存储到LocalStorage中。后续每次请求都会将此token放在请求头中传递到后端服务,后端服务会有一个过滤器对token进行拦截校验,校验token是否过期,如果t......
  • JWT相关
    概念JWT是⼀个开放标准,它定义了⼀种⽤于简洁,⾃包含的⽤于通信双⽅之间以JSON对象的形式安全传递信息的⽅法。可以使⽤HMAC算法或者是RSA的公钥密钥对进⾏签名。优点:⽣产的token可以包含基本信息,⽐如id、⽤户昵称、头像等信息,避免再次查库存储在客户端,不占⽤服务......
  • drf - 基于自定义表编写认证类、jwt源码剖析
    补充点翻译函数; 只要做了国际化处理,就会显示当前国家的语言fromdjango.utils.translationimportgettext_lazyas_msg=_('Signaturehasexpired.')#_是函数的别名,这个函数是翻译函数,只要做了国际化处理,它就是中文基于自定义表编写认证类classAuthAuthent......
  • drf - jwt自定义表签发、jwt 多方式登录(auth的user表)
    jwt自定义表签发1、导入模块: fromrest_framework_jwt.settingsimportapi_settings2、写一个属性:jwt_payload_handler=api_settings.JWT_PAYLOAD_HANDLERjwt_encode_handler=api_settings.JWT_ENCODE_HANDLER3、登录逻辑:classUserViews(ViewSet):......
  • drf之jwt使用
    目录简介JWT构成JWT的使用安装快速使用定制返回格式jwt认证类简介Jsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服......
  • jwt配置及代码模板
    jwt配置及代码模板jwt工具类的使用依赖<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.6.0</version></dependency>application.properties配置jwt.config.key=userlogin......
  • 拦截器实现JWT验证
    拦截器实现JWT验证要在每个请求发送后验证JWTToken的有效性,可以使用Spring中的拦截器(interceptor)来实现。拦截器可以在请求到达控制器之前对请求进行预处理,包括验证JWTToken的有效性。以下是一个简单的示例:首先,创建一个拦截器类JwtInterceptor,用于验证JWTToken的有效性://Jw......
  • DRF之JWT签发Token源码分析
    【一】JWT介绍JWT(JSONWebToken)是一种用于身份认证和授权的开放标准(RFC7519)。它基于JSON格式定义了一种安全的令牌,用于在客户端和服务器之间传输信息。【二】JWT三段式JWT(JSONWebToken)是一种用于身份认证和授权的开放标准(RFC7519)。它基于JSON格式定义了一种安全的令......