在 MVC3 中,有没有办法让角色(SuperAdmin)即使没有在角色列表中明确列出,也总是被授权?
例如,使用此标记...
[Authorize(Roles="Accounting")]
即使我不是会计角色,作为超级管理员,有没有办法获得此操作的授权?
在 MVC3 中,有没有办法让角色(SuperAdmin)即使没有在角色列表中明确列出,也总是被授权?
例如,使用此标记...
[Authorize(Roles="Accounting")]
即使我不是会计角色,作为超级管理员,有没有办法获得此操作的授权?
我强烈建议您阅读保护您的 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 属性被允许匿名访问。此外,具有超级管理员角色的用户允许使用所有方法。
您可以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()
{
}