繁体   English   中英

IExceptionFilter 处理程序在 ASP.NET Core 3.1 Blazor(服务器端)中不起作用

[英]IExceptionFilter handler not working in ASP.NET Core 3.1 Blazor (server-side)

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

应该发生的是,当我们尝试从缓存中获取令牌时,它会抛出MsalUiRequiredException ,过滤器应捕获该异常并强制重新授权。 TokenAcquisition捕获异常并抛出,但过滤器从未捕获它。

为了测试 3.1,我创建了一个简单的 Blazor(服务器端)网站,添加了对Microsoft.Identity.Web的引用,并且我正在尝试调用 Microsoft Graph API; 类似于这个例子

ASP.NET Core 2.2 实现(Startup.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 实现(Startup.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 的示例 repo 依赖于使用属性装饰控制器,并且由于我将 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 包。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM