这是我的代码:
[HttpGet, Authorize(Roles = "Admin")]
public ActionResult ActivityLog()
{
'code to do stuff
return View(model);
}
这很简单 - 如果您处于“管理员”角色,则可以进入此操作。但是我有一个自定义ActionFilter,它使用所有自定义声明填充我的IPrinciple(我无法使用ADFS发送声明,因为我有多个站点的一个ADFS,所以我的声明必须是针对该特定站点)。
public class CustomFilter: ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.User.Identity.IsAuthenticated)
{
'go get custom claims
}
}
}
我将自定义过滤器绑定到Global.asax文件中的应用程序
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CustomFilter());
}
问题是,由于Authorize属性在我的自定义过滤器之前运行,我没有 “管理员”角色,我得到401 - 未经授权的访问错误。如何保留过滤器并使用“授权”属性中的“角色”标记?
答案 0 :(得分:1)
关于
"问题在于,Authorize属性在我的自定义之前运行 过滤器我没有#34; Admin"角色"
您可以创建另一个授权属性,首先访问权限,然后创建设置管理员的标准授权。
执行此操作的方法是注册并指定Order属性
filters.Add(new AuthorizeAttribute(), 1);
filters.Add(new CustomAuthorizeAttribute(), 2);
查看有关Filter Ordering
的更多信息答案 1 :(得分:0)
MVC 4不再支持AuthorizeAttribute。您现在应该使用新的AllowAnonymous属性。
ASP.NET MVC 4包含新的AllowAnonymous属性,您不再需要编写该代码。在global.asax中全局设置AuthorizeAttribute然后将其列入白名单(即,使用AllowAnonymous属性显式修饰方法),您希望选择退出授权的方法被视为保护操作方法的最佳实践。
如果您尝试使用操作过滤器并覆盖AuthorizeCore,您将收到编译时错误“没有合适的覆盖方法”。
这是在MVC 4中执行属性授权的另一种方法:
public class AuthAttribute : AuthorizeAttribute
{
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
HandleUnauthorizedRequest(actionContext);
}
protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
{
var response = actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Redirect);
response.Headers.Add("Location", "http://www.google.com");
actionContext.Response = response;
}
}