12

我创建了一个新的操作过滤器(属性,类似于 [Authorize]),它根据会话值授权对控制器操作的访问。但是,我基本上是用该属性装饰我的所有控制器操作(除了极少数)。

所以,我认为最好始终执行该动作过滤器,除非我将 [ExemptFromAuthorize] 属性附加到控制器动作?(也许通过继承到我自己的 Controller 类?)

我怎样才能做到这一点?

4

7 回答 7

7

查看我关于 codeproject 的文章 -

http://www.codeproject.com/KB/web-security/AuthorizeWithExemptions.aspx

在本文中,我将为您提供一种解决方案,用于保护 ASP.NET MVC 应用程序的控制器,使所有操作都受到保护,但您定义为不安全的操作除外。

代码中的sniper:

public override void OnAuthorization(AuthorizationContext filterContext)
{
    ActionDescriptor action = filterContext.ActionDescriptor;
    bool IsUnsecured = action.GetCustomAttributes(
                         typeof(UnsecuredActionAttribute), true).Count() > 0;

    //If doesn't have UnsecuredActionAttribute - then do the authorization
    filterContext.HttpContext.SkipAuthorization = IsUnsecured;

    base.OnAuthorization(filterContext);
}
于 2010-08-27T17:04:45.460 回答
7

运行jeef3的答案,我想出了这个。它可以使用更多的错误检查和鲁棒性,例如多个分隔操作,但总体思路是有效的。

在您的特定情况下,您可以测试会话值并决定也退出授权。

public class AuthorizeWithExemptionsAttribute : AuthorizeAttribute
{
    public string Exemption { get; set; }
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.RouteData.GetRequiredString("action") == Exemption)
            return;

        base.OnAuthorization(filterContext);
    }

}

用法:

[AuthorizeWithExemptions(Roles="admin", ExemptAction="Index")]
public class AdminController : Controller
...
于 2009-08-27T21:48:13.093 回答
6

我知道这个问题已经过时了,但无论如何.. 如果您希望将过滤器应用于所有操作,只需将以下行添加到 Global.asax 中:

protected void Application_Start()
{
    // your code here and then
    RegisterGlobalFilters(GlobalFilters.Filters);
}    

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new MyActionFilterAttribute());
}

在动作过滤器中,您可以通过以下方式检查动作是否具有任何其他属性:

public void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext.ActionDescriptor.IsDefined(typeof(AnotherActionAttribute), false))
    {
        // do what you want to do
    }
}
于 2013-05-17T09:48:58.210 回答
3

也许尝试Except为您的第一个属性添加一个属性?

[MyAuthenticate(Exempt="View")]
public class MyController : Controller
{
    public ActionResult Edit()
    {
        // Protected
    }

    public ActionResult View()
    {
        // Accessible by all
    }
}
于 2009-08-27T21:03:32.120 回答
2

对于 2013+ 年阅读此文的任何人,MVC4 现在支持使用 [AllowAnonymous]

您可以将 Authorize 放在控制器上,然后将 Allow Anonymous 放在您不想授权的任何功能上。

例子:

[授权] 公共类 HomeController : Controller {

[AllowAnonymous]
public ActionResult Index()
{

} 

}

这是否适用于自定义 [MyAuthorize] 过滤器还是仅适用于 [Authorize]

于 2013-11-04T20:59:57.770 回答
2

您可以将属性添加到类以使其应用于该类中的所有方法

[Authenticate]
public class AccountController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

我不知道如何从类级属性中排除特定方法。也许对未经身份验证的请求使用单独的控制器?

于 2009-08-27T20:56:59.060 回答
1

对于 2013+ 年阅读本文的任何人,MVC4 现在支持使用 [AllowAnonymous]

您可以将 Authorize 放在控制器上,然后将 Allow Anonymous 放在您不想授权的任何功能上。

例子:

[Authorize]
public class HomeController : Controller
{

    [AllowAnonymous]
    public ActionResult Index()
    {

    }
}
于 2013-03-28T21:01:01.500 回答