MiniProfiler 正在绕过我的授权过滤器

MiniProfiler is bypassing my Authorization filter

我有 mini-profiler 工作,但现在我正尝试通过设置功能来限制访问,如 http://miniprofiler.com/

的 "Profiler Security" 中所述
MiniProfiler.Settings.Results_Authorize = IsUserAllowedToSeeMiniProfilerUI;
MiniProfiler.Settings.Results_List_Authorize = IsUserAllowedToSeeMiniProfilerUI;

我的 IsUserAllowedToSeeMiniProfilerUI 函数需要查看 ClaimsPrincipal 的结果,该结果由自定义的全局注册授权过滤器修改。

当我观察通话时,主要请求按预期获得授权,并且 IsUserAllowedToSeeMiniProfilerUI returns 正确。但是,检索探查器结果(~/mini-profiler-resources/results~/mini-profiler-resources/results-index)的 http 请求绕过了我的全局授权过滤器,因此未针对该请求正确修改 ClaimsPrincipal,并且 IsUserAllowedToSeeMiniProfilerUI 不正确 returns false 因为那个。

我将 mini-profiler 的过滤器注册为 GlobalFilters.Filters.Add(new ProfilingActionFilter()),并且还在 web.config 中将处理程序注册为

<system.webServer>
<handlers>
  <add name="MiniProfiler" path="mini-profiler-resources/*" verb="*"
       type="System.Web.Routing.UrlRoutingModule" 
       resourceType="Unspecified" preCondition="integratedMode" />
<!-- ... -->      
</handlers>

我的自定义授权过滤器已在 Global.asax 中注册,方法是将其添加为 GlobalFilters.Filters.Add(new MyAuthorizationFilter())

为什么 mini-profiler 会绕过我的授权过滤器?

GlobalFilters 以 MVC 框架为中心。所以默认情况下,全局注册的授权过滤器只会对 mvc 框架处理的请求生效——而不是对所有的 http 请求。

MiniProfiler 在单个 class MiniProfilerHandler 中实现其客户端结果,该 MiniProfilerHandler 实现了两者 IRouteHandler and IHttpHandler。 (默认分析器提供程序 WebRequestProfilerProvider 确保 MiniProfilerHandler 的路由已注册。UrlRoutingModule 的 web.config 注册可确保实际路由迷你分析器 url。)

因此,迷你探查器将探查器结果 http 请求直接作为通过路由定位的 http 处理程序进行处理 - 在正常的 MVC 请求流之外。

因此有必要处理任何自定义授权逻辑,例如IsUserAllowedToSeeMiniProfilerUI 方法考虑到不保证任何授权过滤器(或与此相关的其他操作过滤器)具有 运行。但是请注意,一旦开始分析,Results_Authorize 似乎也会在某个阶段被调用,因此您还必须处理过滤器 具有 运行 的情况。

另请参阅:Understanding the MVC Application Execution Process