在控制器的操作中覆盖控制器的 [Authorize(Roles="X")] 过滤器
Override a controller's [Authorize(Roles="X")] filter in an action of that controller
在 MVC 应用程序中,某些控制器具有受角色限制的访问权限(有一个 Authorize
过滤器,其角色附加到控制器)。现在客户决定这个控制器中的一个操作应该对所有经过身份验证的用户可用(所以单独使用 AllowAnonymous
过滤器不会解决问题,在 AllowAnonymous
之后添加 Authorize
过滤器不会'不工作)。我该怎么做?
在我的例子中,我无法真正将动作移动到另一个控制器并将过滤器放在控制器上,然后将其添加到所有动作,但这听起来不是个好主意。
AllowAnonymous
过滤器将使操作忽略所有 Authorize
过滤器,因此快速而肮脏的解决方案是将条件直接包含在操作中(在这种情况下检查用户是否经过身份验证).最后,如果条件不满足returnHttpUnauthorizedResult
,则保留默认的"redirect to login page"行为。
[AllowAnonymous]
public ActionResult ActionAvailableToEveryone()
{
if (!User.Identity.IsAuthenticated)
{
return new HttpUnauthorizedResult();
}
return View();
}
这个问题可能有 better\more 优雅的解决方案,但更改会员提供程序或仅为单个操作编写自定义过滤器听起来有点矫枉过正。
您可以对特定操作使用覆盖属性之一,然后按照此 post 中的建议应用不同的过滤器:Filter Overrides
我在网络上工作 API。
在 MVC 应用程序中,某些控制器具有受角色限制的访问权限(有一个 Authorize
过滤器,其角色附加到控制器)。现在客户决定这个控制器中的一个操作应该对所有经过身份验证的用户可用(所以单独使用 AllowAnonymous
过滤器不会解决问题,在 AllowAnonymous
之后添加 Authorize
过滤器不会'不工作)。我该怎么做?
在我的例子中,我无法真正将动作移动到另一个控制器并将过滤器放在控制器上,然后将其添加到所有动作,但这听起来不是个好主意。
AllowAnonymous
过滤器将使操作忽略所有 Authorize
过滤器,因此快速而肮脏的解决方案是将条件直接包含在操作中(在这种情况下检查用户是否经过身份验证).最后,如果条件不满足returnHttpUnauthorizedResult
,则保留默认的"redirect to login page"行为。
[AllowAnonymous]
public ActionResult ActionAvailableToEveryone()
{
if (!User.Identity.IsAuthenticated)
{
return new HttpUnauthorizedResult();
}
return View();
}
这个问题可能有 better\more 优雅的解决方案,但更改会员提供程序或仅为单个操作编写自定义过滤器听起来有点矫枉过正。
您可以对特定操作使用覆盖属性之一,然后按照此 post 中的建议应用不同的过滤器:Filter Overrides
我在网络上工作 API。