MVC4中Authorize属性的自定义角色

时间:2013-10-28 18:43:21

标签: asp.net-mvc-4 action-filter

这是我的代码:

[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 - 未经授权的访问错误。如何保留过滤器并使用“授权”属性中的“角色”标记?

2 个答案:

答案 0 :(得分:1)

关于

  

"问题在于,Authorize属性在我的自定义之前运行   过滤器我没有#34; Admin"角色"

您可以创建另一个授权属性,首先访问权限,然后创建设置管理员的标准授权。

执行此操作的方法是注册并指定Order属性

filters.Add(new AuthorizeAttribute(), 1);
filters.Add(new CustomAuthorizeAttribute(), 2);

查看有关Filter Ordering

的更多信息

答案 1 :(得分:0)

MVC 4不再支持AuthorizeAttribute。您现在应该使用新的AllowAnonymous属性。

http://blogs.msdn.com/b/rickandy/archive/2012/03/23/securing-your-asp-net-mvc-4-app-and-the-new-allowanonymous-attribute.aspx

  

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;
    }
}