zoukankan      html  css  js  c++  java
  • ASP.NET MVC AuthorizeAttribute 相关

    AuthorizeAttribute 类

    .NET Framework 4
     

    表示一个特性,该特性用于限制调用方对操作方法的访问。

    命名空间: System.Web.Mvc
    程序集: System.Web.Mvc(在 System.Web.Mvc.dll 中)
     
    许多 Web 应用程序要求在用户登录之后才授予其对受限制内容的访问权限。在某些应用程序中,即使是登录的用户,也会限制他们可以查看的内容或可以编辑的字段。

    要限制对 ASP.NET MVC 视图的访问,您可以限制对呈现视图的操作方法的访问。为此,MVC 框架提供 AuthorizeAttribute 类。

    使用 AuthorizeAttribute

    当您使用 AuthorizeAttribute 标记一个操作方法时,则限制只有经过身份验证和授权的用户才能访问该操作方法。如果您使用该特性标记控制器,则限制控制器中的所有操作方法。

    Authorize 特性允许您指明将授权限制给预定义角色或各个用户。这使您可以高度控制谁有权查看网站上的任何页面。

    如果未经授权的用户尝试访问用 Authorize 特性标记的方法,则 MVC 框架会返回 401 HTTP 状态代码。如果站点配置为使用 ASP.NET Forms 身份验证,401 状态代码会导致浏览器将用户重定向到登录页。

     
    自定义AuthorizeAttribute

    网站的权限判断是一个非常普遍的需求,从文章ASP.NET MVC的Action Filter中我们知道实现这样的需求只要从AuthorizeAttribute集成,重写相关的判断逻辑就可以了。这里记录一下:

    namespace TokenAcl.Web.Helper
    {
    public class TokenAclAuthorizeAttribute : AuthorizeAttribute
    {
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
    bool result = false;
    if (httpContext == null)
    {
    throw new ArgumentNullException("httpContext");
    }
    string[] users = Users.Split(',');
    string[] roles = Roles.Split(',');
    if (!httpContext.User.Identity.IsAuthenticated)
    return false;
    if (roles.Length != 0)
    {
    List<Role> rightRoles = RightClient.GetAllRole(TakenAclMenu.SystemID, TakenAclMenu.UserID);
    foreach (var role in roles)
    {
    if (rightRoles.Where(x => x.Code == role).Count() > 0)
    {
    result = true;
    break;
    }
    }
    }
    if (!result)
    {
    httpContext.Response.StatusCode = 403;
    }
    return result;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
    base.OnAuthorization(filterContext);
    if (filterContext.HttpContext.Response.StatusCode == 403)
    {
    filterContext.Result = new RedirectResult("/Admin/Dashboard");
    }
    }
    }
    }

    从AuthorizeAttribute继承过来实现了一个类TokenAclAuthorizeAttribute ,重写了方法AuthorizeCore,使用自己开发的权限系统进行权限的验证,如果没有通过认证,这表示没有权限访问,设置HTTP 状态代码为403。 这样还是不行,还得重写另一个方法OnAuthorization。AuthorizeCore方法返回false,MVC 此时将返回的ActionResult是HttpUnauthorizedResult:

    public class HttpUnauthorizedResult : ActionResult {
    public override void ExecuteResult(ControllerContext context) {
    if (context == null) {
    throw new ArgumentNullException("context");
    }
    // 401 is the HTTP status code for unauthorized access - setting this
    // will cause the active authentication module to execute its default
    // unauthorized handler
    context.HttpContext.Response.StatusCode = 401;
    }
    }

    从HttpUnauthorizedResult的源码可以看出,HttpUnauthorizedResult的执行很简单,就是设置当前的HttpContext.Response的状态码为401,这样就回激活authentication module 执行它默认的 unauthorized handler,也就是跳转到登陆页面的,这似乎也不符合逻辑,认证和授权应该是验证的两个方面。这不符合要求,用户已经登陆成功了,只是没有权限而已。我这里只是重写OnAuthorization方法,重定向到一个页面而已,也可以写一个ActionResult。

  • 相关阅读:
    -Prefix.pch has been modified 的错误修复
    Xcode插件,模板安装
    php 内置函数JSON处理
    OC 创建单例
    UITabBarController 的配置
    execute、executeQuery和executeUpdate之间的区别
    iOS类方法实例方法 与 self
    iOS U7ea2 乱码 转换
    PHP 页面跳转的三种方式
    C#数组 动态添加元素
  • 原文地址:https://www.cnblogs.com/EasyLive2006/p/2194198.html
Copyright © 2011-2022 走看看