创建一个即使未列出也始终被授权的角色

时间:2012-07-11 21:09:49

标签: c# asp.net-mvc-3 roleprovider

在MVC3中有一种方法可以使角色( SuperAdmin )即使未在角色列表中明确列出,也始终授权吗?

例如使用此标记...

[Authorize(Roles="Accounting")]

即使我不在会计角色中,因为 SuperAdmin 是否有办法获得此行动的授权?

2 个答案:

答案 0 :(得分:2)

我强烈建议您阅读Securing your ASP.NET MVC 3 Application

首先,创建您的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 Filters(global.asax)中注册GlobalAuthorize:

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

现在所有控制器都要求用户登录才能访问。控制器或控制器方法可以允许使用AllowAnonymous属性进行匿名访问。此外,SuperAdmin角色中的用户允许使用所有方法。

答案 1 :(得分:1)

您可以创建自定义的AuthorizeAttribute,在AuthorizeCore方法中可以实现额外的逻辑。

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

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()
{
}