在为托管的 Blazor WebAssembly 应用提供服务之前,如何使用 Azure AD B2C 对服务器上的用户进行身份验证?

How can I use Azure AD B2C to authenticate users on the server before serving a hosted Blazor WebAssembly app?

我有一个 Blazor WebAssembly 应用程序。它是独立的,不使用任何网络 API 调用。我想使用我现有的 Azure AD B2C 租户添加身份验证,以便只有注册用户才能访问该应用程序。

微软says that:

In Blazor WebAssembly apps, authorization checks can be bypassed because all client-side code can be modified by users.

因此,我不想静态托管我的 Blazor 应用程序(独立模型),而是想使用 ASP.NET 核心托管模型(所以是 ASP.NET Core app serves the Blazor app to clients)。这样我就可以在服务器上执行 authentication/authorization - 如果用户已注册并被允许访问该应用程序,则 ASP.NET Core 应用程序会为他们提供 Blazor 应用程序。如果不是,则可以向他们显示错误页面或重定向。

问题是我不确定如何实现它。

当我在 Visual Studio 2019 年从模板创建新的 Blazor WebAssembly 托管应用程序时,它创建了三个项目。共享项目、Blazor 项目和服务器项目。服务器项目引用了 Blazor 项目。这行出现在Startup.csConfigure方法的末尾:

endpoints.MapFallbackToFile("index.html");

这似乎是它为客户端提供 Blazor 应用程序的原因。我不确定如何向其中添加 authentication/authorization。我尝试将此行修改为如下所示:

endpoints.MapFallbackToFile("index.html").RequireAuthorization();

但应用程序仍会加载,而不会首先重定向到登录屏幕。

有一些名为“Secure an ASP.NET Core Blazor WebAssembly hosted app with Azure Active Directory B2C”的 Microsoft 文档,这听起来像是我所需要的,但它实际上仍在客户端应用程序中进行身份验证,同时还保护对服务器应用程序的 API 调用(我不需要)。

有什么方法可以完成我正在尝试做的事情 - 在为 Blazor 应用程序提供服务之前在服务器上对用户进行身份验证,而不是在 Blazor 应用程序本身中进行身份验证?

答案很简单。实际上,RequireAuthorization() 调用确实有效。如果您已经登录到 B2C,您将不会首先被重定向到登录页面(并且,至少在 Edge 中,它甚至不会在重定向回应用程序之前先明显地重定向到 B2C,因此会造成混淆)。但是,如果我在私人浏览器中加载该页面 window 我将被重定向到 B2C 登录页面 - 所以它必须按预期工作。

为了将来参考,标题问题的答案是:

  1. 如果您还没有向 ASP.NET 核心服务器应用添加授权。
  2. 在服务器应用中,添加对 Blazor 应用的项目引用。
  3. 将以下行添加到 Startup.csConfigure 方法中的 UseEndpoints 调用:
endpoints.MapFallbackToFile("index.html").RequireAuthorization();