1

这是我的代码:

[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 - Unauthorized Access 错误。我如何仍然保留过滤器并在 Authorize 属性中使用“角色”标签?

4

2 回答 2

1

关于

“问题是因为授权属性在我的自定义过滤器之前运行,所以我没有“管理员”角色”

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

您这样做的方式是注册并指定 Order 属性

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

查看有关过滤器订购的更多信息

于 2013-10-28T20:05:10.257 回答
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;
    }
}
于 2014-01-17T04:22:04.370 回答