在MVC3中有一种方法可以使角色( SuperAdmin )即使未在角色列表中明确列出,也始终授权吗?
例如使用此标记...
[Authorize(Roles="Accounting")]
即使我不在会计角色中,因为 SuperAdmin 是否有办法获得此行动的授权?
答案 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()
{
}