我想在我的管理控制器使用[Authorize]的每一个动作,除了Login行动。

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

解决方案

我不认为你可以用标准的授权属性做到这一点,但你可以得到从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://农场新鲜-code.blogspot.com/2011/04/default-authorization-filter-provider.html

其他提示

您可以装点[授权]您的控制器,然后你可以装饰要与[使用AllowAnonymous]免受方法

您可以重写控制器的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();
        }
    }
}
}

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

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);
        }
    }
}

然后登记在我的全球filetrs:

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

希望,这将是有用的人

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top