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。

  • 相关阅读:
    Java Web 网络留言板2 JDBC数据源 (连接池技术)
    Java Web 网络留言板3 CommonsDbUtils
    Java Web ConnectionPool (连接池技术)
    Java Web 网络留言板
    Java Web JDBC数据源
    Java Web CommonsUtils (数据库连接方法)
    Servlet 起源
    Hibernate EntityManager
    Hibernate Annotation (Hibernate 注解)
    wpf控件设计时支持(1)
  • 原文地址:https://www.cnblogs.com/EasyLive2006/p/2194198.html
Copyright © 2011-2022 走看看