是否可以在MVC控制器中禁用一个操作的授权?

时间:2012-03-06 09:50:31

标签: asp.net-mvc

我在控制器上有一个授权属性,但我想在一个动作上将其关闭。 我创建了自己的授权过滤器,并在“角色”列表中添加了“匿名”。在我的过滤器中,如果Anonymous出现在角色列表中,则返回true。

但是,它似乎没有通过登录页面,就好像控制器授权正在抢占其他任何东西。

5 个答案:

答案 0 :(得分:98)

您可以将[Authorize]添加到控制器类,然后将[AllowAnonymous]添加到您不希望获得授权的单个操作中。例如:

[Authorize]
public class AccountController : Controller
{
    public ActionResult Profile()
    {
        return View();
    }

    [AllowAnonymous]
    public ActionResult Login()
    {
        return View();
    }
}

答案 1 :(得分:3)

您可以创建自己的属性版本。

有一个非常相似的问题,如何实现处理这种情况的自己的属性有一个非常好的答案。

Override Authorize Attribute in ASP.NET MVC

顺便说一下。您也可以创建默认具有授权的控制器。

<强>基

[Authorize]
public abstract class SecureControllerBase : Controller
{
}

<强>用法

public class MyController : SecureControllerBase
{
}

答案 2 :(得分:2)

我刚刚使用Azure ACS作为联合身份提供程序做了一个解决方案,并且接受的答案对我不起作用。对于那些正在挣扎的人,我的解决方案是完全绕过所需的控制器/视图的安全性。

为您需要绕过授权的操作创建新的Controller / Views。

在web.config中添加以下内容,

 <location path="TheNameOfTheControllerYouWantToBypass">
  <system.web>
  <authorization>
    <allow users="*" />
  </authorization>
  </system.web>
 </location>

答案 3 :(得分:0)

只需将属性添加到要过滤的操作,而不是控制器类。如果控制器或其中一个基本控制器没有属性,则不会对操作进行修改,不会对其进行过滤。

答案 4 :(得分:-2)

不要在您的操作方法中添加AuthorizationAttribute,例如,您不需要。

我的自定义属性

public class AuthorizationFilterAttribute : AuthorizeAttribute
{
    // Some code...
}

我的控制器

public class UserController : BaseController, IDisposable
{
    [AuthorizationFilterAttribute]
    public ActionResult UserList()
    {
        // Authorize attribute will call when this action is executed
    }

    public ActionResult AddUser()
    {
        // Authorize attribute will not call when this action is executed
    }
}

我希望你明白我想说的是你。

============================更新后的答案============== ==================

再创建一个属性,如下所示。

public sealed class AnonymousAttribute : Attribute { }

请将以下代码放在OnAuthorization方法上。

public override void OnAuthorization(AuthorizationContext filterContext)
{
    bool checkForAuthorization =
        filterContext.ActionDescriptor.IsDefined(typeof(AnonymousAttribute), true) ||
        filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AnonymousAttribute), true);

    if (!skipAuthorization)
    {
        base.OnAuthorization(filterContext);
    }
}