4

在 MVC3 中,有没有办法让角色(SuperAdmin)即使没有在角色列表中明确列出,也总是被授权?

例如,使用此标记...

[Authorize(Roles="Accounting")]

即使我不是会计角色,作为超级管理员,有没有办法获得此操作的授权?

4

2 回答 2

2

我强烈建议您阅读保护您的 ASP.NET MVC 3 应用程序

首先,创建您的AnonymousAttribute

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, 
                AllowMultiple = false,    
                Inherited = true)]
public sealed class AllowAnonymousAttribute : Attribute 
{ 
}

其次,创建您的GlobalAuthorize属性:

public sealed class GlobalAuthorize : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        bool bypassAuthorization = 
            filterContext.ActionDescriptor
                         .IsDefined(typeof(AllowAnonymousAttribute), 
                                    true)
            || filterContext.ActionDescriptor
                            .ControllerDescriptor
                            .IsDefined(typeof(AllowAnonymousAttribute),
                                       true)
            || (filterContext.RequestContext
                            .HttpContext
                            .User != null
                && filterContext.RequestContext
                                .HttpContext
                                .User
                                .IsInRole("SuperAdmin"));

        if (!bypassAuthorization)
        {
            base.OnAuthorization(filterContext);
        }
    }
}

第三,在您的全局过滤器(global.asax)中注册 GlobalAuthorize:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
  filters.Add(new GlobalAuthorize());
}

现在所有控制器都需要用户登录才能访问。控制器或控制器方法可以通过 AllowAnonymous 属性被允许匿名访问。此外,具有超级管理员角色的用户允许使用所有方法。

于 2012-07-11T21:27:54.163 回答
1

您可以AuthorizeAttributeAuthorizeCore方法中创建您可以实现额外逻辑的自定义位置。

一个没有正确错误处理的简单示例:

public class AuthorizeSuperAdminAttribute : AuthorizeAttribute
{
     protected virtual bool AuthorizeCore(HttpContextBase httpContext) 
     {    
         IPrincipal user = httpContext.User; 
         if (user.Identity.IsAuthenticated && user.IsInRole("SuperAdmin"))
                return true;

         return base.AuthorizeCore(httpContext);    
     }
}

然后您可以在您的操作中正常使用它:

[AuthorizeSuperAdmin(Roles="Accounting")]
public ActionResult MyAction()
{
}
于 2012-07-11T21:22:18.120 回答