• ASP.NET MVC 4 过滤器(Authorize)


    640?wx_fmt=jpeg

    Authorize特性类AuthorizeAttribute就称作MVC的Filter,它在横向为MVC框架扩展功能,让我们可以更方便的处理日志、授权、缓存等而不影响纵向主体功能。

    Authorization:实现IAuthorizationFilter接口,默认实现类AuthorizeAttribute,在调用Action方法前首先处理认证信息。


    授权过滤器顾名思义就是授权用的,授权过滤器在方法执行之前执行,用于限制请求能不能进入这个方法,新建一个方法:

    public JsonResult AuthorizeFilterTest() 

    {  

      return Json(new ReturnModel_Common { msg = "hello world!" });

     }

    直接访问得到结果:

    640?wx_fmt=jpeg

    现在假设这个AuthorizeFilterTest方法是一个后台方法,用户必须得有一个有效的令牌(token)才能访问,常规做法是在AuthorizeFilterTest方法里接收并验证token,但是这样一旦方法多了,每个方法里都写验证的代码显然不切实际,这个时候就要用到授权过滤器:

    public class TokenValidateAttribute : AuthorizeAttribute

        {

            /// <summary>

            /// 授权验证的逻辑处理。返回true则通过授权,false则相反

            /// </summary>

            /// <param name="httpContext"></param>

            /// <returns></returns>

            protected override bool AuthorizeCore(HttpContextBase httpContext)

            {

                string token = httpContext.Request["token"];

                if (string.IsNullOrEmpty(token))

                {

                    return false;

                }

                else

                {

                    return true;

                }

            }

        }

    新建了一个继承AuthorizeAttribute的类,并重写了其中的AuthorizeCore方法,这段伪代码实现的就是token有值即返回true,没有则返回false,标注到需要授权才可以访问的方法上面:

    [TokenValidate]public JsonResult AuthorizeFilterTest() 

    {    return Json(new ReturnModel_Common { msg = "hello world!" })  }

    标注TokenValidate后,AuthorizeCore方法就在AuthorizeFilterTest之前执行,如果AuthorizeCore返回true,那么授权成功执行AuthorizeFilterTest里面的代码,否则授权失败。不传token:

    640?wx_fmt=jpeg

    传token:

    640?wx_fmt=jpeg

    不传token授权失败时进入了MVC默认的未授权页面。这里做下改进:不管授权是成功还是失败都保证返回值格式一致,方便前端处理,这个时候重写AuthorizeAttribute类里的HandleUnauthorizedRequest方法即可:

    /// <summary>

    /// 授权失败处理

    /// </summary>

    /// <param name="filterContext"></param>

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)

    {

        base.HandleUnauthorizedRequest(filterContext);


        var json = new JsonResult();

        json.Data = new ReturnModel_Common

        {

            success = false,

            code = ReturnCode_Interface.Token过期或错误,

            msg = "token expired or error"

        };

        json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;

        filterContext.Result = json;

    }

    效果:

    640?wx_fmt=jpeg

    经验:授权过滤器最广泛的应用还是做权限管理系统,用户登录成功后服务端输出一个加密的token,后续的请求都会带上这个token,服务端在AuthorizeCore方法里解开token拿到用户ID,根据用户ID去数据库里查是否有请求当前接口的权限,有就返回true,反之返回false。这种方式做授权,相比登录成功给Cookie和Session的好处就是一个接口PC端、App端共同使用。

  • 相关阅读:
    TP5.1 分页CSS样式(转载)
    简单的layui二级联动
    关于layui部分表单不显示的问题(Select, checkBox)
    MySQL 开启远程访问权限 | 宝塔系统
    tp5.1 本地正常, 线上route.php不起作用的问题
    cocos自动图集
    微信小程序video
    nuxt https
    接口数据加密
    node里读取命令行参数
  • 原文地址:https://www.cnblogs.com/hgmyz/p/12351570.html
Copyright © 2020-2023  润新知