第二十九篇 MVC5的AuthorizeAttribute详解

当我们用.net MVC构建网站平台的时候,势必会对网站平台的安全性和用户的使用权限进行一个统一的构建,首先在.net MVC 架构中,系统已经将权限管理分为三个层面来进行管理,第一层面是 登录管理,也就是说在这个层面上完成用户口令的验证,即完成用户的登录,系统保存用户的登录记录。第二层面是授权,即赋予用户是否具备使用权限,是通过 AuthorizeAttribute 的特性来进行控制和管理的。第三个层面是是凭据缓存机制,系统建立System.Security.Claims.Claim来实现的,一旦登录成功系统就会在Cookies里面缓存给用户一个Claim,这样完成了用户登录信息的缓存。

那么如果对某一个模块具体进行权限控制呢?为了建立一个更加灵活的管理机制,我们采用了建立自己的 AuthorizeAttribute 来完成。首先我们来对需求进行一个简单的分析,如下图所示:一个功能模块我们可以通过指定用户,或指定权限来完成,也可能在使用时,通过角色和权限的控制来完成。

现今大多数的网站尤其是购物网站都要求你登录后才能继续操作,当你匿名的将商品放入购物车后,不可能匿名购买这时可以转到登录界面让用户进行登录验证。

适用系统自带的过滤器

MVC5只要将属性[Authorize]置于相关的action之前就行,那么在调用Buy action之前,就会运用Authorize过滤器。
[Authorize]
public ActionResult Buy(int id)
{
//其它购买逻辑代码放在这里

    }

  2. 也可以将属性[Authorize]置于整个Controller之上。这样位于此控制器下的所有action就都运用了此过滤器。

[Authorize]
public class UserController : Controller
{
   //一些action
 }

  3. 也可以将Authorize应用到全部的应用程序的范围类,要使AuthorizeAttribute成为全程序的过滤器,只要将其加入全局过滤器集合RegisterGlobalFilters方法,这个方法位于\App_Start\FilterConfig.cs:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
filters.Add(new System.Web.Mvc.AuthorizeAttribute());
filters.Add(new HandleErrorAttribute());
}
  4. 如果我们允许部分的控制器或者action允许匿名访问怎么办?只需要在相应的控制器或者action上添加属性[AllowAnonymous]

// GET: /Account/Login
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}

  注意:

  全局控制器的应用只适用于MVC的Controller和Action,对于Web Forms,静态页面,和其它的HTTP handlers 都不适用。

关于使用自己的过滤器:(以下引用kuangkro的博客:http://www.cnblogs.com/xlhblogs/p/3349972.html)

我们不一定要用MVC默认的Authorize授权验证规则,规则可以自己来定,自定义授权过滤器可以继承AuthorizeAttribute这个类,这个类里面有两个方法是要重写的

     bool AuthorizeCore(HttpContextBase httpContext):这里主要是授权验证的逻辑处理,返回true的则是通过授权,返回了false则不是。
     void HandleUnauthorizedRequest(AuthorizationContext filterContext):这个方法是处理授权失败的事情。

这里就定义了一个比较骑呢的授权处理器,当请求的时候刚好是偶数分钟的,就通过可以获得授权,反之则不通过。当授权失败的时候,就会跳转到登陆页面了。

public class MyAuthorizeAttribute:AuthorizeAttribute
{

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    
{
        //return base.AuthorizeCore(httpContext);
        return DateTime.Now.Minute % 2 == 0
    }


    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    
{
        filterContext.HttpContext.Response.Redirect("/Customer/Login");

        //base.HandleUnauthorizedRequest(filterContext);
    }
}

然后用到一个行为方法上,

    [MyAuthorize]
    public ActionResult ShowDetail()
    
{
        return View();
    }

每当偶数分钟的时候就可以访问得到这个ShowDetail的视图,否则就会跳到了登陆页面了。

更多技术请关注

第二十九篇 MVC5的AuthorizeAttribute详解

第二十九篇 MVC5的AuthorizeAttribute详解》来自互联网,仅为收藏学习,如侵权请联系删除。本文URL:https://www.hashtobe.com/845.html