【问题标题】:IExceptionFilter handler not working in ASP.NET Core 3.1 Blazor (server-side)IExceptionFilter 处理程序在 ASP.NET Core 3.1 Blazor(服务器端)中不起作用
【发布时间】:2020-01-23 16:15:55
【问题描述】:

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

应该发生的是,当我们尝试从缓存中获取令牌时,它会抛出一个MsalUiRequiredException,它应该被过滤器捕获并强制重新验证。 TokenAcquisitioncatches the exception 并抛出但过滤器永远不会捕获它。

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

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 的示例存储库依赖于使用属性装饰控制器,并且由于我将 Razor 页面用于我的 2.2 Web 应用程序和 Blazor(服务器端)用于我的 3.1 Web 应用程序,因此我不得不修改如下:

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

我一直在与维护回购协议的同事合作,但我们都对为什么它没有被触发感到困惑。由于 3.1 不再使用“UseMvc”语句,这甚至是正确的实现吗?据我所知it looks correct

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

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core


    【解决方案1】:

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

    官话:https://github.com/dotnet/aspnetcore/issues/18761

    【讨论】:

    • 你有没有想过这个问题?我找不到在 Blazor 中处理 MsalUiRequiredException 的好方法。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-25
      • 2020-05-23
      • 2020-07-08
      • 2020-09-30
      • 1970-01-01
      • 2019-04-19
      • 2020-01-05
      • 2020-02-11
      相关资源
      最近更新 更多