是否可以覆盖ASP.NET MVC中[Authorize]的默认行为?

Ale*_*lex 9 .net c# asp.net-mvc authorize-attribute action-filter

我想知道是否/如何覆盖ASP.NET MVC中的默认[Authorize]行为.我知道我可以创建一个新的Action Filter,创建自己的属性等等; 我只是感兴趣,如果我可以简单地更改[授权]行为并用我自己的代码替换它的工作?

编辑:男孩和女孩.感谢您的意见,但正如我所写,我打算引入新的[XYZAuthorize]属性.我知道怎么做.我想保留[授权]符号,但只是改变它的工作原理.

Bru*_*eis 9

您可以继承AuthorizeAttribute过滤器并将自己的逻辑放入其中.

我们来看一个例子吧.假设您想要始终授权本地连接.但是,如果它是远程连接,您希望保留通常的授权逻辑.

你可以这样做:

public class LocalPermittedAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return (httpContext.Request.IsLocal || base.AuthorizeCore(httpContext)));
        }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以随时授权某个远程地址(例如您的机器).

而已!

编辑:忘记提及,您将使用它与使用AuthorizeAttribute过滤器相同:

class MyController : Controller
{
    [LocalPermittedAuthorize]
    public ActionResult Fire()
    {
        Missile.Fire(Datetime.Now);
    }
}
Run Code Online (Sandbox Code Playgroud)


Bra*_*non 6

是的,请查看AuthorizeAttribute的MSDN文档:http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx.

基本上,您可以覆盖OnAuthorization()方法并自定义行为.该属性上还有其他虚拟方法.

编辑:正如Bruno所指出的,您可以覆盖AuthorizeCore()方法.主要区别在于AuthorizeCore()采用HttpContextBase,而OnAuthorization()采用AuthorizationContext.AuthorizationContext的实例为您提供了更多信息,例如Controller,RequestContext和RouteData.它还允许您指定ActionResult.

AuthorizeCore()在您可以访问的信息以及可以返回的结果中受到更多限制,但是如果您需要授权缓存数据,那么您的逻辑需要处理您没有任何额外数据的情况(因为在通过MVC管道路由请求之前从缓存提供数据.

与往常一样,您需要了解您的场景以及它们之间的可用工具和权衡.