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

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

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

是的,请查看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管道路由请求之前从缓存提供的。

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

您可以inheritanceAuthorizeAttributefilter并将自己的逻辑放入其中。

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

你可以这样做:

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

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

而已!

编辑:忘记提及,您将使用它与使用AuthorizeAttributefilter相同:

 class MyController : Controller { [LocalPermittedAuthorize] public ActionResult Fire() { Missile.Fire(Datetime.Now); } } 

实施您自己的角色提供程序并设置您的应用程序以使用它。 然后Authorize属性将尊重您的授权代码。

我只看到两种方法:重写AuthorizeAttribute.OnAuthorization方法或从头开始创建自己的authorize属性。

1)非常容易:

 public class CustomAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { base.OnAuthorization(filterContext); /// your behavior here } } 

2)也很简单 – 只需看看ASP.NET MVC源代码, AuthorizeAttribute.cs文件

您似乎可以像往常一样实现自定义filter(如果需要,还可以inheritanceAuthorizeAttribute),然后创建一个inheritanceControllerActionInvoker并覆盖GetFilters的新ActionInvoker。 在GetFilters中,您调用base.GetFilters()来获取filter列表,遍历AuthorizationFilters并通过调用自定义filter替换对AuthorizeFilter的调用。

另一种可能的方法是实现自定义成员资格和角色提供程序,具体取决于您要执行的操作。