WebApi中添加Jwt鉴权

这篇具有很好参考价值的文章主要介绍了WebApi中添加Jwt鉴权。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

WebApi中添加Jwt鉴权

项目介绍

项目框架:.NET Core 3.1

项目依赖:

  • Swashbuckle.AspNetCore

  • JWT

项目架构:

WebApi中添加Jwt鉴权

项目核心代码

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页面

WebApi中添加Jwt鉴权

登录获取Token

WebApi中添加Jwt鉴权

未携带token访问接口

WebApi中添加Jwt鉴权

源码获取

关注公众号,后台回复关键字:JwtApiDemo文章来源地址https://www.toymoban.com/news/detail-710271.html

到了这里,关于WebApi中添加Jwt鉴权的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    视频地址:【WebApi+Vue3从0到1搭建《权限管理系统》系列视频:搭建JWT系统鉴权-哔哩哔哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中设置鉴权属性 二、新建模型 添加模型JwtSettingModel其中字段和appsettings.json中的字段一样,如下 三、新建解析appsettings.json节点的帮助类

    2024年04月22日
    浏览(36)
  • 【从0到1设计一个网关】基于JWT实现用户鉴权

    代码讲解链接 项目开源代码-点个star领取完整4w字开发文档 JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 JSON 对象。它通常用于在不同系统之间进行身份验证和授权,以及在各种应用中传递声明性信息。 JWT 由三部分组成,它们通过点号(

    2024年02月05日
    浏览(35)
  • 【Python开发手册】JWT Token中添加过期时间和角色:简单易学的pyjwt

    💖 作者简介:大家好,我是Zeeland,全栈领域优质创作者。 📝 CSDN主页:Zeeland🔥 📣 我的博客:Zeeland 📚 Github主页: Undertone0809 (Zeeland) (github.com) 🎉 支持我:点赞👍+收藏⭐️+留言📝 📣 系列专栏:Python系列专栏 🍁 💬介绍:The mixture of software dev+Iot+ml+anything🔥 【cushy-s

    2023年04月23日
    浏览(43)
  • 将JWT令牌存储到浏览器中localStorage中,并且往页面请求头中添加token

    其中response.data.data是后端返回的数据为jwt字符串 在vue中的main.js添加如下再带,axios便会拦截所有请求并且如果localStorage有token则会添加到页面的请求头中

    2024年02月21日
    浏览(47)
  • 图片接口JWT鉴权实现

    之前做了个返回图片链接的接口,然后没做授权,然后今天键盘到了,也是用JWT来做接口的权限控制。 然后JTW网上已经有很多文章来说怎么用了,这里就不做多的解释了,如果不懂的可以参考下列链接的 文章。 图片接口文章:还在愁个人博客没有图片放? JTW参考: 画星星

    2024年02月07日
    浏览(41)
  • AspNetCore 成长杂记(一):JWT授权鉴权之生成JWT(其一)

    最近不知怎么的,自从学了WebAPI(为什么是这个,而不是MVC,还不是因为MVC的Razor语法比较难学,生态不如现有的Vue等框架,webapi很好的结合了前端生态)以后,使用别人的组件一帆风顺,但是不知其意,突然很想自己实现一个基于的JWT认证服务,来好好了解一下这个内容。 自

    2023年04月19日
    浏览(34)
  • AspNetCore 成长杂记(一):JWT授权鉴权之生成JWT(其二)

    前面说了用第三方类库生成JWT的故事,给我带来了很大的方便,并且我也承诺要写一篇用常规方法生成JWT的文章( 一般都是用微软官方的类库 ),因此才有了这篇文章。 另外,在前面的文章中,我要纠正一下一些错误JWT的整个结构决定了JWT只能作为临时的授权认证解决方案,

    2023年04月26日
    浏览(29)
  • .Net Core Jwt鉴权授权

    目录 简介 基于.Net Core 验证方式 Jwt获取Token 引入三方包 生成Token UserInfo JwtConfig WebApi测试(获取Token) Program.cs appsetting.json Controller .Net Core 验证(webApi) Progarm.cs Contorller .Net Core 授权 简介 Program.cs JwtAuthorization.cs 注意 Autofac 注册授权服务 Controller 注意 jwt触发委托 Jwt分为三段 通过远

    2024年02月13日
    浏览(32)
  • 【Express.js】JWT基础鉴权

    Web安全是Web应用中非常重要的一环,主要由后端和服务器承担安全保障 面对请求源,后端有着各种各样的鉴权机制: session,cookie,token,jwt,OAuth,OAuth2,api-key,signature… 本节以jwt为例,演示一个极简的token鉴权 拷贝第一节HelloWorld项目 安装一种jwt依赖(本节使用jsonwebtoken) 接下来我们使

    2024年02月09日
    浏览(35)
  • Springboot实现简单JWT登录鉴权

    登录需要鉴权是为了保护系统的安全性和用户的隐私。在一个 Web 应用中,用户需要提供一定的身份信息(例如用户名和密码)进行登录,登录后系统会为用户生成一个身份令牌(例如 JWT Token)来标识用户的身份。 鉴权的主要目的是确保只有经过身份验证的用户才能访问系统

    2024年02月13日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包