我想知道是否/如何覆盖ASP.NET MVC中的默认[Authorize]行为。我知道我可以创建一个新的Action Filter,创建我自己的属性等等;我只是感兴趣,如果我可以简单地改变[授权]行为并用我自己的代码替换它的工作?
修改:男孩和女孩。感谢您的意见,但正如我所写,我 不 希望引入新的[XYZAuthorize]属性。我知道怎么做。我想保留[授权]符号,但只是改变它的工作方式。
答案 0 :(得分:9)
您可以继承AuthorizeAttribute过滤器并将自己的逻辑放入其中。
我们来看一个例子。假设您想要始终授权本地连接。但是,如果它是远程连接,您希望保留通常的授权逻辑。
您可以执行以下操作:
public class LocalPermittedAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return (httpContext.Request.IsLocal || base.AuthorizeCore(httpContext)));
}
}
或者您可以随时授权某个远程地址(例如您的机器)。
就是这样!
编辑:忘记提及,您将使用与使用AuthorizeAttribute过滤器相同的内容:
class MyController : Controller
{
[LocalPermittedAuthorize]
public ActionResult Fire()
{
Missile.Fire(Datetime.Now);
}
}
答案 1 :(得分: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管道路由之前从缓存提供的)。
与往常一样,您需要了解您的方案以及它们之间的可用工具和权衡。
答案 2 :(得分:4)
实施您自己的角色提供程序并设置您的应用程序以使用它。然后,Authorize属性将尊重您的授权代码。
答案 3 :(得分:2)
我只看到两种方法:覆盖AuthorizeAttribute.OnAuthorization
方法或从头开始创建自己的授权属性。
1)非常容易:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
/// your behavior here
}
}
2)也很容易 - 只需看看ASP.NET MVC源代码,AuthorizeAttribute.cs文件
答案 4 :(得分:1)
您似乎可以像往常一样实现自定义过滤器(如果需要,还可以继承AuthorizeAttribute),然后创建一个继承ControllerActionInvoker并覆盖GetFilters的新ActionInvoker。在GetFilters中,您调用base.GetFilters()
来获取过滤器列表,遍历AuthorizationFilters并通过调用自定义过滤器替换对AuthorizeFilter的调用。
另一种可能的方法是实现自定义成员资格和角色提供程序,具体取决于您要执行的操作。