在控制器的操作中覆盖控制器的[授权(角色=" X")]过滤器

时间:2015-03-10 12:38:02

标签: c# asp.net-mvc simplemembership

在MVC应用程序中,某个控制器具有受角色限制的访问权限(有Authorize过滤器,其角色附加到控制器)。现在,客户端决定该控制器中的其中一个操作应该对所有经过身份验证的用户可用(因此AllowAnonymous过滤器无法完成此操作并在Authorize之后添加AllowAnonymous过滤器工作)。我该怎么做呢?

在我的情况下,我无法将动作移动到另一个控制器并将滤镜放在控制器上,然后将其添加到所有动作中,但听起来不是一个好主意。

2 个答案:

答案 0 :(得分:0)

AllowAnonymous过滤器会使操作忽略所有Authorize过滤器,因此快速而肮脏的解决方案是将条件直接包含在操作中(在这种情况下,检查用户是否经过身份验证)。最后,如果不满足条件,则返回HttpUnauthorizedResult,以保留默认"重定向到登录页面"行为。

[AllowAnonymous]
public ActionResult ActionAvailableToEveryone()
{
    if (!User.Identity.IsAuthenticated)
    {
        return new HttpUnauthorizedResult();
    }
    return View();
}

可能有更好的\更优雅的问题解决方案,但更改成员资格提供程序或仅针对单个操作编写自定义过滤器听起来有点矫枉过正。

答案 1 :(得分:0)

您可以对特定操作使用其中一个覆盖属性,然后按照此帖中的建议应用其他过滤器:Filter Overrides

在Web API中为我工作。