多次调用授权
本文关键字:授权 调用 | 更新日期: 2023-09-27 17:56:47
>我有一个自定义过滤器:
public class SetAuthFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
//do something
}
}
在Global.asax
下的Application_Start()
中:
GlobalFilters.Filters.Add(new SetAuthFilter());
每次调用操作时都会调用上述代码。
但是,在我的_Layout.cshtml
中,我有 2 个不同的"BaseController
",如下所示:
@Html.Action("SomeAction", "Base")
@Html.Action("SomeAction", "Base2")
当我设置断点时,似乎总是调用三次SetAuthFilter
,第一次是在页面启动之前,然后是当我的断点命中BaseController
时第二次,最后是当我的断点命中Base2Controller
时第三次。
我应该怎么做才能避免SetAuthFilter
被多次调用?
如果有多个操作与筛选器交互,则根本无法阻止调用它。 它将调用每个请求。 但是,您可以缓存该用户身份的最后一个请求,如果是相同的请求,则立即返回,而无需继续执行更繁重的授权检查。
public class SetAuthFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
var key = CreateKey(filterContext);
var isCached = HttpRuntime.Cache.Get(key);
if (isCached != null) return;
HttpRuntime.Cache.Insert(key, true);
// Heavy auth logic here
}
private string CreateKey(AuthorizationContext context)
{
// Or create some other unique key that allows you to identify
// the same request
return
context.RequestContext.HttpContext.User.Identity.Name + "|" +
context.RequestContext.HttpContext.Request.Url.AbsoluteUri;
}
}
请注意,这不会考虑空标识或错误的 URI。您需要添加一些额外的防御性检查以及缓存失效策略。
这将不允许您绕过身份验证,因为每个唯一请求仍需要验证。 但是,它可以最大限度地减少调用昂贵的授权逻辑的次数。
对于每个安全控制器操作,将调用 OnAuthorization 重载。
如果不希望发生这种情况,则应使用 AllowAnonymous 属性修饰函数。
如果不想在每个方法上调用自定义筛选器:然后从 Global.asax 下的 Application_Start() 中删除以下行:
GlobalFilters.Filters.Add(new SetAuthFilter());
在那些真正需要授权过滤器的方法和控制器上添加 [SetAuth] 属性,如下所示:
[SetAuth]
public ActionResult Index()
{
// your code
return View(yourModel);
}