Как я могу использовать Azure AD B2C для аутентификации пользователей на сервере перед обслуживанием размещенного приложения Blazor WebAssembly?

#asp.net-core #blazor #azure-ad-b2c #blazor-webassembly

#asp.net-core #blazor #azure-ad-b2c #blazor-webassembly

Вопрос:

У меня есть приложение Blazor WebAssembly. Он является автономным и не использует никаких вызовов web API. Я хотел бы добавить аутентификацию с использованием моего существующего клиента Azure AD B2C, чтобы только зарегистрированные пользователи могли получить доступ к приложению.

Microsoft заявляет, что:

В приложениях Blazor WebAssembly проверки авторизации можно обойти, поскольку весь клиентский код может быть изменен пользователями.

Поэтому вместо статического размещения моего приложения Blazor (автономная модель) я хотел бы использовать ASP.NET Основная размещенная модель (так что ASP.NET Основное приложение обслуживает приложение Blazor для клиентов). Таким образом, я могу выполнить аутентификацию / авторизацию на сервере — если пользователь зарегистрирован и ему разрешен доступ к приложению, ASP.NET Основное приложение предоставляет им приложение Blazor. Если это не так, им может быть показана страница с ошибкой или они могут быть перенаправлены.

Проблема в том, что я не уверен, как это реализовать.

Когда я создаю новое размещенное приложение Blazor WebAssembly из шаблона в Visual Studio 2019, оно создает три проекта. Общий проект, проект Blazor и серверный проект. Проект сервера имеет ссылку на проект Blazor. Эта строка появляется в конце Configure метода Startup.cs :

 endpoints.MapFallbackToFile("index.html");
  

Похоже, это то, что заставляет его обслуживать приложение Blazor для клиента. Я не уверен, как я могу добавить к этому аутентификацию / авторизацию. Я попытался изменить эту строку, чтобы она выглядела следующим образом:

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

Но приложение по-прежнему загружается без перенаправления на экран входа в систему.

Существует некоторая документация Microsoft под названием «Secure an ASP.NET Core Blazor WebAssembly размещал приложение с Azure Active Directory B2C«, который звучит так, как будто это то, что мне нужно, но на самом деле он все еще выполняет аутентификацию в клиентском приложении, одновременно защищая вызовы API для серверного приложения (что мне не нужно).

Есть ли какой-либо способ выполнить то, что я пытаюсь сделать — аутентифицировать пользователя на сервере перед обслуживанием приложения Blazor, вместо того, чтобы выполнять эту аутентификацию в самом приложении Blazor?

Ответ №1:

Ответ был действительно прост. На самом деле, RequireAuthorization() вызов действительно работает. Если вы уже вошли в B2C, вы не будете перенаправлены сначала на страницу входа (и, по крайней мере, в Edge, он даже не перенаправляет на B2C, прежде чем перенаправлять обратно в приложение, отсюда и путаница). Но если я загружаю страницу в частном окне браузера, я перенаправляюсь на страницу входа в систему B2C, поэтому она должна работать так, как задумано.

Для дальнейшего использования ответ на вопрос заголовка:

  1. Добавьте аутентификацию в ASP.NET Основное серверное приложение, если вы еще этого не сделали.
  2. В серверном приложении добавьте ссылку на проект в приложение Blazor.
  3. Добавьте следующую строку к UseEndpoints вызову внутри Configure метода в Startup.cs :
 endpoints.MapFallbackToFile("index.html").RequireAuthorization();