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

时间:2009-08-22 08:45:09

标签: c# .net asp.net-mvc authorize-attribute action-filter

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

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

5 个答案:

答案 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的调用。

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