zoukankan      html  css  js  c++  java
  • 笨鸟先飞之ASP.NET MVC系列之过滤器(02授权过滤器)

    授权过滤器

    概念介绍

    在之前的文章中我们已经带大家简单的了解了下过滤器,本次我们开始介绍授权过滤器。
    我们之前提到过授权过滤器在认证过滤器之后,其他过滤器和方法被调用之前运行,而授权过滤器和它名字的含义一样主要是负责执行我们的授权逻辑,确保我们要调用的方法只被我们认证过的用户使用。

    自定义授权过滤器

    首先我们还是用之前创建的MVC项目模板,我们在里面新建一个Filter文件夹,我们的过滤器文件就放在这,接着我们创建一个授权过滤器CustomAuthAttribute

    接着我们继承FilterAttribute类,和IAuthorizationFilter接口

    namespace System.Web.Mvc
    {
        //
        // 摘要:
        //     定义授权筛选器所需的方法。
        public interface IAuthorizationFilter
        {
            //
            // 摘要:
            //     在需要授权时调用。
            //
            // 参数:
            //   filterContext:
            //     筛选器上下文。
            void OnAuthorization(AuthorizationContext filterContext);
        }
    }
    

    接着我们必须实现接口中的OnAuthorization方法就像下面这样

       public class CustomAuthAttribute : FilterAttribute, IAuthorizationFilter
        {
            public void OnAuthorization(AuthorizationContext filterContext)
            {
               
            }
        }
    

    我们看到OnAuthorization方法返回一个AuthorizationContext对象,它的属性如下:

    名称 类型 说明
    ActionDescriptor ActionDescriptor 提供 System.Web.Mvc.AuthorizeAttribute 特性标记的操作方法的相关信息,如操作方法的名称、控制器、参数、特性和筛选器。
    Result ActionResult 获取或设置由操作方法返回的结果。

    好了我们去控制器相应的地方打上标记看看

    不是一般只用继承IAuthorizationFilter接口就行了么,为什么还要继承FilterAttribute类呢?
    我们先来看看这个类的含义

    FilterAttribute 类
    表示操作和结果筛选器特性的基类。
    通常,可以通过创建从抽象 FilterAttribute 类继承的特性类来创建筛选器。 一些内置操作筛选器(如 AuthorizeAttribute 和 HandleErrorAttribute)是从 FilterAttribute 类继承的。 其他操作筛选器(如 OutputCacheAttribute)是从抽象 ActionFilterAttribute 类继承的,这使操作筛选器可在操作方法运行之前或之后运行。
    你可以使用筛选器特性标记任何操作方法或控制器。 如果特性标记了某个控制器,则筛选器将应用于该控制器中的所有操作方法。
    

    那么我们再看看不加这个类会发生什么

    是的我们发现如果不继承于FilterAttribute类,我们无法在需要进行权限验证的方法前打上标记

    接着我们之前实现的OnAuthorization方法具体有什么作用呢?

    OnAuthorization方法在我们执行我们所要调用的方法之前调用,我们主要的判断权限逻辑写在这里

    那么基础的部分我们就介绍完了下面我们简单的实现过滤器看看。

    我们在的OnAuthorization中去做判断,如果访问地址是我们本地那么我们返回登录页

    public void OnAuthorization(AuthorizationContext filterContext)
            {
                if (filterContext.HttpContext.Request.IsLocal)
                {
                    var Url = new UrlHelper(filterContext.RequestContext);
                    var url = Url.Action("Login", "Account");
                    filterContext.Result = new RedirectResult(url);
                }
    
            }
    

    我们来看一看效果

    我们看到这样我们的授权功能就实现了

    另一种实现方式

    当然我们除了自己实现IAuthenticationFilter接口外还有一种方式是我们可以通过继承与MVC自带的AuthorizeAttribute类来实现这个功能,当然比如我要实现之前我们实现地功能我们可以这样写。
    同样的我们添加一个新的过滤器LoginsAuthAttribute还是添加在之前的文件夹中,然后我们添加如下代码

            private bool localAllowed;
    
            public LoginsAuthAttribute(bool allowedParam)
            {
                localAllowed = allowedParam;
            }
    
            protected override bool AuthorizeCore(HttpContextBase httpContext)
            {
                if (httpContext.Request.IsLocal)
                {
                    return localAllowed;
                }
                else
                {
                    return true;
                }
            }
    

    我们通过重写AuthorizeCore方法来实现一个布尔类型的值来觉定用户是否授权,我们在这个过滤器中增加了一个参数,我们也可以通过这个参数来决定这个用户是否需要授权才能使用方法。
    比如我们这样调用那么用户就必须实现我们的授权逻辑才能访问页面否则就会返回到登录页

            [LoginsAuth(false)]
            public ActionResult About()
            {
    
                return View();
            }
    

    好了,我们本次的授权过滤器就先讲到这里了,当然这些只是基础用法,如果您有好的意见或者建议,也可以在评论中留言,如果觉得我的博客对你有帮助也可以点赞支持,您的鼓励是我最大的动力:)

  • 相关阅读:
    sqlite错误 Abort due to constraint violation column id is not unique id没开启自动增长
    字符串转为日期类型
    XPTable 一行添加数据 如果想添加多行 可以使用for循环
    在逮捕异常的时候 可以获取e.MESSAGE里面的信息 然后判断是什么异常
    C# 加载图片image (C#)Image.FromFile 方法会锁住文件的原因及可能的解决方法
    计算两个时间的前后 时间戳
    用C#语言写的多线程演示程序:两个线程,可以开始,可以暂停,可以恢复,可以清除。
    sqlite插入日期时候 出现18991230 0:00:00
    datagridview绑定dataset的时候 需要这一句
    WinForm 子线程修改主线程(UI线程)Control 【Z】
  • 原文地址:https://www.cnblogs.com/chen-jie/p/APS-NET-MVC-AuthorizeFilter.html
Copyright © 2011-2022 走看看