9

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

编辑:男孩和女孩。感谢您的意见,但正如我所写,我不想引入新的 [XYZAuthorize] 属性。我知道如何做到这一点。我想保留 [Authorize] 符号,但只是改变它的工作方式。

4

5 回答 5

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);
    }
}
于 2009-08-22T09:02:05.287 回答
6

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

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

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

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

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

于 2009-08-22T09:04:20.710 回答
4

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

于 2009-08-22T15:55:39.283 回答
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文件

于 2009-08-22T09:03:58.637 回答
1

看来您可以像往常一样实现自定义过滤器(如果需要,可以继承 AuthorizeAttribute),然后创建一个继承ControllerActionInvoker并覆盖 GetFilters 的新 ActionInvoker。在 GetFilters 中,您调用base.GetFilters()以获取过滤器列表,遍历 AuthorizationFilters 并将对 AuthorizeFilter 的调用替换为对自定义过滤器的调用。

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

于 2009-08-22T09:09:10.217 回答