我有一个具有两种类型角色的 ASP.NET MVC4 站点:管理员和合作伙伴。
基本上所有对站点的访问都需要用户进行身份验证并具有管理员角色。因此,我在 FilterConfig.cs 中执行此操作(从 Global.asax 调用):
public class FilterConfig {
public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
filters.Add(new HandleErrorAttribute());
filters.Add(new AuthorizeAttribute { Roles = "Administrator" }); // default deny
}
}
但是,对于一个控制器,我想向具有合作伙伴角色但没有管理员角色的用户授予访问权限。我知道我可以通过不使用全局过滤器而是在每个控制器或操作上设置授权属性来做到这一点,但我想要一种白名单方法,而不是默认情况下所有访问都需要“管理员”角色,然后使用某种形式的白名单.
我曾尝试使用一个控制器来覆盖 OnAuthorization,如下所示:
public class MyController : Controller {
protected override void OnAuthorization(AuthorizationContext filterContext) {
if (User.Identity.IsAuthenticated) {
var attributes = new List<AllowRolesAttribute>();
attributes.AddRange(filterContext.ActionDescriptor.GetCustomAttributes(true).OfType<AllowRolesAttribute>());
attributes.AddRange(filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(true).OfType<AllowRolesAttribute>());
foreach (var authorizationAttribute in attributes) {
foreach (var role in authorizationAttribute.Roles.Split(',')) {
if (User.IsInRole(role))
return; // Skip authorization because user has one of the allowed roles.
}
}
}
base.OnAuthorization(filterContext);
}
}
然后我像这样定义控制器:
[AllowRoles(Roles = "Partner")]
public class HomeController : MyController
{
...
但这不起作用。当我使用角色为“Partner”的用户访问此控制器时,我可以将代码跟随到内部 return 语句中,但用户仍被重定向到登录页面而不是被授权。我在这里想念什么?