IException筛选器处理程序在 ASP.NET 核心 3.1 Blazer(服务器端)中不起作用



我正在测试我在 ASP.NET Core 2.2网站中使用的异常过滤器的功能。这是对 Microsoft.Identity.Web 示例存储库中AuthorizeForScopesAttribute类的轻微修改。

应该发生的是,当我们尝试从缓存中获取令牌时,它将抛出一个应该被过滤器捕获并强制重新身份验证的MsalUiRequiredExceptionTokenAcquisition类捕获异常并引发,但筛选器永远不会捕获它。

为了测试 3.1,我创建了一个简单的 Blazor(服务器端(网站,添加了对Microsoft.Identity.Web的引用,并尝试调用 Microsoft 图形 API;类似于此示例。

ASP.NET Core 2.2 实现(启动.cs(:

services.AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
options.Filters.Add(new AuthorizeForScopesAttribute(new string[] {ScopeConstants.ScopeUserRead}));
});

ASP.NET Core 3.1 实现(启动.cs(:

services.AddControllersWithViews(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
options.Filters.Add(new AuthorizeForScopesAttribute(new[] {ScopeConstants.ScopeUserRead}));
});

Microsoft.Identity.Web 的示例存储库依赖于使用属性修饰控制器,并且由于我将 Razor 页面用于 2.2 Web 应用程序,将 Blazor(服务器端(用于 3.1 Web 应用程序,因此我必须对其进行修改,如下所示:

  • ExceptionFilterAttribute替换为IExceptionFilter
  • 添加了一个构造函数并在Startup.cs中提供了Scopes属性
  • 由于这不是抽象类的实现(现在使用接口(,因此我删除了OnException方法中的override语句,因此现在只是public void OnException(ExceptionContext context)

我一直在与维护存储库的同事合作,但我们都对为什么没有触发它感到困惑。由于 3.1 不再使用"UseMvc"语句,这甚至是正确的实现吗?据我所知,它看起来是正确的。

仅供参考:我意识到类名也不再反映这不再是一个属性的事实,但我现在只是保持名称不变。

事实证明,Blazor 应用程序中不支持 ASP.NET Core 中的异常筛选器。鉴于GH的指导,我将研究替代方案,并将相应地更新这篇文章。

官方用语:https://github.com/dotnet/aspnetcore/issues/18761

一种可能的解决方法是将_host作为页面,以便可以触发[AuthorizeForScopes]的方法。下面是一个示例:https://github.com/wmgdev/BlazorGraphApi/blob/master/BlazorGraphApi/Pages/_host.cshtml.cs

我们目前没有官方的 Blazor 示例,但显然这种用户方法有效。此外,一个很好的更新是Microsoft.Identity.Web现在是一个NuGet包。

最新更新