17

我想[Authorize]在我的管理控制器中使用除操作之外的每个Login操作。

[Authorize (Roles = "Administrator")]
public class AdminController : Controller
{
    // what can I place here to disable authorize?
    public ActionResult Login()
    {
        return View();
    }
}
4

4 回答 4

28

您可以使用 [Authorize] 装饰您的控制器,然后您可以使用 [AllowAnonymous] 装饰您想要豁免的方法

于 2013-05-09T07:11:02.443 回答
14

我认为您不能使用标准的 Authorize 属性来执行此操作,但您可以从 AuthorizeAttribute 派生您自己的属性,该属性采用一系列操作以允许并仅允许访问这些操作。您可以在www.codeplex.com上查看 AuthorizeAttribute 的源代码,了解如何执行此操作。如果你这样做了,它可能看起来像:

[AdminAuthorize (Roles = "Administrator", Exempt = "Login, Logout") ]
public class AdminController : Controller
{
    public ActionResult Login()
    {
        return View();
    }

    public ActionResult Login()
    {
        return View();
    }

    ... other, restricted actions ...
}

编辑:仅供参考,我最终遇到了自己做类似事情的需要,我走了一个不同的方向。我创建了一个默认授权过滤器提供程序并应用了一个全局授权过滤器。授权过滤器提供程序使用反射来检查操作或控制器是否应用了特定的授权属性,如果是,则遵循它。否则,它将应用默认授权过滤器。这与派生自 AuthorizeAttribute 的 PublicAttribute 相结合,允许公共访问。现在,我获得了默认的安全访问权限,但可以通过[Public]应用于操作或控制器来授予公共访问权限。也可以根据需要应用更具体的授权。请参阅我的博客http://farm-fresh-code.blogspot.com/2011/04/default-authorization-filter-provider.html

于 2008-11-30T23:03:00.153 回答
5

您可以覆盖控制器的 OnAuthorization 方法

    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        if ((string)(filterContext.RouteData.Values["action"]) == "Login")
        {
            filterContext.Cancel = true;
            filterContext.Result = Login();
        }
    }

这有效,但它是一个黑客。

用于测试的完整类代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication2.Controllers
{
[HandleError]
[Authorize]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Title"] = "Home Page";
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }


    public ActionResult About()
    {
        ViewData["Title"] = "About Page";

        return View();
    }


    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        if ((string)(filterContext.RouteData.Values["action"]) == "Index")
        {
            filterContext.Cancel = true;
            filterContext.Result = Index();
        }
    }
}
}
于 2008-11-30T23:14:02.097 回答
1

可能不是实际的,但我写了我的自定义属性:

public class SelectableAuthorizeAttribute : AuthorizeAttribute
{
    public SelectableAuthorizeAttribute(params Type[] typesToExclude)
    {
        _typesToExlude = typesToExclude;
    }

    private readonly Type[] _typesToExlude;

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        bool skipAuthorization = _typesToExlude.Any(type => filterContext.ActionDescriptor.ControllerDescriptor.ControllerType == type);

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

然后在我的全局文件中注册它:

filters.Add(new SelectableAuthorizeAttribute(typeof(MyController)));

希望它对某人有用

于 2012-07-19T05:30:01.733 回答