我想知道是否/如何可以覆盖 ASP.NET MVC 中的默认 [Authorize] 行为。我知道我可以创建一个新的动作过滤器,制作我自己的属性等等;如果我可以简单地更改 [Authorize] 行为并用我自己的代码替换它的工作,我只是感兴趣吗?
编辑:男孩和女孩。感谢您的意见,但正如我所写,我不想引入新的 [XYZAuthorize] 属性。我知道如何做到这一点。我想保留 [Authorize] 符号,但只是改变它的工作方式。
我想知道是否/如何可以覆盖 ASP.NET MVC 中的默认 [Authorize] 行为。我知道我可以创建一个新的动作过滤器,制作我自己的属性等等;如果我可以简单地更改 [Authorize] 行为并用我自己的代码替换它的工作,我只是感兴趣吗?
编辑:男孩和女孩。感谢您的意见,但正如我所写,我不想引入新的 [XYZAuthorize] 属性。我知道如何做到这一点。我想保留 [Authorize] 符号,但只是改变它的工作方式。
您可以继承 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);
}
}
是的,请查看 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 管道路由之前从缓存中提供的)。
与往常一样,您需要了解您的场景以及可用的工具以及它们之间的权衡。
实现您自己的角色提供者并将您的应用设置为使用它。然后 Authorize 属性将尊重您的授权代码。
我只看到两种方法:覆盖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文件
看来您可以像往常一样实现自定义过滤器(如果需要,可以继承 AuthorizeAttribute),然后创建一个继承ControllerActionInvoker并覆盖 GetFilters 的新 ActionInvoker。在 GetFilters 中,您调用base.GetFilters()
以获取过滤器列表,遍历 AuthorizationFilters 并将对 AuthorizeFilter 的调用替换为对自定义过滤器的调用。
另一种可能的方法是实现自定义成员资格和角色提供程序,具体取决于您要执行的操作。