首页 > 其他分享 >操作过滤器—MVC中使用操作过滤器实现JWT权限认证

操作过滤器—MVC中使用操作过滤器实现JWT权限认证

时间:2023-08-11 09:24:45浏览次数:41  
标签:JWT 接口 Token MVC context 过滤器 授权 authHeader

前言

上一篇文章分享了授权过滤器实现JWT进行鉴权,文章链接:授权过滤器—MVC中使用授权过滤器实现JWT权限认证,接下来将用操作过滤器实现昨天的JWT鉴权。

一、什么是操作过滤器?

​ 与授权过滤器大部分一样,只是执行的时机和继承的接口有所不同。操作过滤器是在Action执行的前和后进行调用执行。而不是像授权过滤器一样,在刚开上来就执行授权过滤器。操作过滤器的实现了是 IAsyncActionFilterIActionFilter 接口。
image

二、操作过滤器实现

操作过滤器重新定义Filter:

继承类Attribute, 接口MyAuthorizeFilterAttribute ,然后实现接口OnActionExecuted方法和OnActionExecuting方法,提供更多的对Action执行处理方法。此处在Action执行时书写自定义业务逻辑。

 /// <summary>
    /// 授权过滤器
    /// </summary>
    public class MyAuthorizeFilterAttribute : Attribute, IActionFilter
    {
       #region IActionFilter 操作过滤器实现

        /// <summary>
        /// Action执行后
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuted(ActionExecutedContext context)
        {

        }
        /// <summary>
        /// Action执行前
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuting(ActionExecutingContext context)
        {
            var authHeader = context.HttpContext.Request.Headers["Authorization"];
            if (string.IsNullOrWhiteSpace(authHeader))
            {
                //var json =  JsonConvert.SerializeObject(new OperationResult(OperationResultType.Error, "保存失败"));
                //此接口必须携带token访问!
                context.Result = new ContentResult()
                {

                    Content = "此接口必须携带token访问,请登录携带Token访问",
                    ContentType = "text/html"//application/json
                };
            }
            else //字段值不为空
            {
                authHeader = authHeader.ToString().Replace("Bearer", "").Trim();//去掉Bearer字串
                if (authHeader == "")
                {
                    context.Result = new ContentResult()
                    {
                        Content = "token验证失败:您没有权限调用此接口,请登录重新获取Token",
                        ContentType = "text/html"
                    };
                }
                else
                {
                    LoginUserInfo LoginInfo = JwtHelper.GetJwtDecode(authHeader);
                    string UserName = LoginInfo.username;
                    string PassWord = LoginInfo.pwd;
                    double ExpireTimeStamp = LoginInfo.exp;
                    if (isTokenExpire(ExpireTimeStamp)) //这里应该验证有效期
                    {
                        //token验证失败:您没有权限调用此接口,请登录获取Token
                        context.Result = new ContentResult()
                        {
                            Content = "token验证失败:您没有权限调用此接口,请登录重新获取Token",
                            ContentType = "text/html"
                        };
                    }
                }

            }
        }
        #endregion

        /// <summary>
        /// 时间戳字符串
        /// </summary>
        /// <param name="timestamp"></param>
        /// <returns></returns>
        private bool isTokenExpire(double timestamp)
        {
            try
            {
                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;
            }
        }

    }

其他实现代码和上篇保持一致:

三、验证:

​ 操作过滤器实现的接口部分代码没有改动,只改动过滤器的书写,所以和上篇测试验证方法一致。

未授权访问:

不携带Token访问:
image

授权访问:

获取Token:
image

携带Token访问:
image

建群声明:本着技术在于分享,方便大家交流学习的初心,特此建立【编程内功修炼交流群】,热烈欢迎各位爱交流学习的程序员进群,也希望进群的大佬能不吝分享自己遇到的技术问题和学习心得!
image

标签:JWT,接口,Token,MVC,context,过滤器,授权,authHeader
From: https://www.cnblogs.com/wml-it/p/17622162.html

相关文章

  • .net6 过滤器、管道模型
    管道处理模型1、[中间件](https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-7.0)可以在典型应用中了解现有中间件的顺序,以及在哪里添加自定义中间件。你可以完全控制如何重新排列现有中间件,或根据场景需要注入新的自定义中间件。......
  • Servlet过滤器
    过滤器的基本概念Servlet过滤器从字面上的字意理解为经过一层次的过滤处理才达到使用的要求,而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Servlet过滤器主要用于对浏览器的请求进行过滤处理,将过滤后的请求再转给下一个资源。Filter是在......
  • spring-mvc 系列:拦截器和异常处理器
    目录一、拦截器的配置二、拦截器的三个抽象方法三、多个拦截器的执行顺序四、基于配置的异常处理器五、基于注解的异常处理器一、拦截器的配置SpringMVC中的拦截器用于拦截控制器方法的执行SpringMVC中的拦截器需要实现HandlerInterceptorSpringMVC的拦截器必须在SpringMVC的......
  • 扩展SpringMVC框架的消息转化器
    1、消息转化器请求和响应都有对应的body,而这个body就是需要关注的主要数据。请求体与请求的查询参数或者表单参数是不同的,请求体的表述一般就是一段字符串,而查询参数可以看作url的一部分,这两个是位于请求报文的不同地方。表单参数可以按照一定格式放在请求体中,也可以放在url上......
  • SpringMVC支持跨域访问详解
    跨站HTTP请求(Cross-siteHTTPrequest)是指发起请求的资源所在域不同于该请求所指向资源所在的域的HTTP请求。这里有域名的不同,端口号的不同。很多浏览器在发起跨域访问时是会询问用户是否需要发送该请求,或者干脆不发送跨域访问请求。(最好的办法是不使用ajax之类的,不要在前端......
  • RR有幻读问题吗?MVCC能否解决幻读?
    幻读是MySQL中一个非常普遍,且面试中经常被问到的问题,如果你还搞不懂什么是幻读?什么是MVCC?以及MySQL中的锁?那么请好好收藏和阅读本篇文章,因为它非常重要。RR隔离级别在MySQL中,RR代表RepeatableRead(可重复读),是数据库事务隔离级别中的一种,它的特性是保证同一个事务中,多......
  • django自定义过滤器
    https://docs.djangoproject.com/zh-hans/3.1/howto/custom-template-tags/代码布局自定义的tags和filters会保存在模块名为 templatetags 的目录内。模块文件的名字即稍候你用来加载tags的名字,所以小心不要采用一个可能与其它应用自定义的tags和filters冲突的名......
  • 从浅入深了解.NET Core MVC 2.x全面教程【第二章】
    章节第一章:https://blog.51cto.com/kimiliucn/6996292第二章:https://blog.51cto.com/kimiliucn/7020412二、Logging1.诊断中间件命名空间:Microsoft.AspNetCore.Diagnostics报告信息并处理异常2.诊断中间件UseDeveloperExceptionPage:开发时使用的异常页面,异常信息UseStatusCodePages......
  • 从浅入深了解.NET Core MVC 2.x全面教程【第二章】
    二、Logging1.诊断中间件命名空间:Microsoft.AspNetCore.Diagnostics报告信息并处理异常2.诊断中间件UseDeveloperExceptionPage:开发时使用的异常页面,异常信息UseStatusCodePages:返回状态码:400-600UserExceptionHandler:指定异常处理器UseWelcome:当网站还在建设中3.A......
  • JWT授权
     jwt:头部(Header)、载荷(Payload)和标记(Signature)头部:主要是规定生成token加密方式的类型和算法,载荷:可以存储一些用户身份信息标记:主要作用防篡改,验证令牌的真实性和完整性 引用jwt包appsettings里: //jwt秘钥  "Jwt": {    "SecretKey": "jiangjianhaotest12......