是否可以覆盖ASP.NET MVC中[授权]的默认行为?
-
19-09-2019 - |
题
我想知道/如何在ASP.NET MVC中覆盖默认的[授权]行为。我知道我可以创建一个新的动作过滤器,制作自己的属性等等。如果我可以简单地更改[授权]行为并用自己的代码替换其工作,我只是感兴趣的吗?
编辑: :男孩和女孩。感谢您的意见,但正如我写的那样,我是 不是 希望引入一个新的[xyzauthorize]属性。我知道如何做到这一点。我想保留[授权]符号,而只是更改其工作方式。
解决方案
是的,查看授权图的MSDN文档: http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx.
基本上,您可以覆盖onauthorization()方法并自定义行为。属性也有其他虚拟方法。
编辑:正如Bruno指出的那样,您可以覆盖授权()方法。主要区别在于,授权()采用httpcontextbase,而onauthorization()获得授权context。授权访问的实例为您提供了更多信息,例如控制器,RequestContext和Routedata。它还使您可以指定一个动作重点。
授权()在您可以访问的信息以及可以返回的结果中受到更大的限制,但是如果您需要授权缓存的数据,那么您的逻辑需要处理没有任何额外数据的情况(由于在通过MVC管道将请求路由之前从缓存中提供数据)。
与往常一样,您需要了解您的场景以及它们之间的可用工具和权衡。
其他提示
您可以将“授权”材料过滤器子列为子,并将自己的逻辑放入其中。
让我们看看一个例子。假设您想始终授权本地连接。但是,如果它是远程连接,您希望保持通常的授权逻辑。
您可以做类似的事情:
public class LocalPermittedAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return (httpContext.Request.IsLocal || base.AuthorizeCore(httpContext)));
}
}
或者,您始终可以授权某个远程地址(例如,您的计算机)。
而已!
编辑:忘了提及,您将使用它与使用ostrizeattribute过滤器相同:
class MyController : Controller
{
[LocalPermittedAuthorize]
public ActionResult Fire()
{
Missile.Fire(Datetime.Now);
}
}
实施您自己的角色提供商并将您的应用程序设置为使用。然后,授权属性将尊重您的修复代码。
我只看到两种方法:覆盖 AuthorizeAttribute.OnAuthorization
方法或从头开始创建自己的授权属性。
1)非常简单:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
/// your behavior here
}
}
2)也很容易 - 只看ASP.NET MVC源, 授权tribute.cs 文件
看来您可以照常实现自定义过滤器(并在需要的话(如果需要的话)上继承授权,然后创建一个新的ActionInVoker,以继承 ControllerActionInVoker 并覆盖了fotfilters。在GetFilters中,您打电话给 base.GetFilters()
要获取过滤器列表,请通过“授权”算法进行迭代,然后通过拨打定制过滤器的呼叫来替换授权文件的呼叫。
另一个潜在的方法是根据您要做的事情实施自定义会员资格和角色提供商。