#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, поэтому она должна работать так, как задумано.
Для дальнейшего использования ответ на вопрос заголовка:
- Добавьте аутентификацию в ASP.NET Основное серверное приложение, если вы еще этого не сделали.
- В серверном приложении добавьте ссылку на проект в приложение Blazor.
- Добавьте следующую строку к
UseEndpoints
вызову внутриConfigure
метода вStartup.cs
:
endpoints.MapFallbackToFile("index.html").RequireAuthorization();