Как осуществить процедуру авторизации и аутентификации на сервере Blazor?

Конечно, обращаюсь к вам!

При изучении технологии Blazor Server у меня возникли вопросы по авторизации и аутентификации.  Я имею опыт работы с asp.net core mvc и web api, но мне интересуют основные принципы авторизации:

1. Как использовать jwt токен и получить базовую информацию о пользователе из него? Например, чтобы отобразить логин текущего пользователя в navbar.
2. Где лучше хранить данные о пользователе? Мои коллеги используют IdentityUser (или UserIdentity), но мне не очень нравится этот подход. Я ищу более явное решение.
3. Можно ли хранить данные в HttpContext в виде объекта ClaimIdentity с набором Claim, который я смогу получить после декодирования jwt токена?
  • 16 декабря 2023 г. 15:07
Ответы на вопрос 2
1. Чтобы использовать JWT токен и получить информацию о пользователе из него, вам следует выполнить следующие шаги:

- Создайте токен с помощью методов кодирования, таких как `JwtSecurityTokenHandler` в ASP.NET Core.
- В этом токене вы можете добавить клеймы (claim), содержащие информацию о пользователе, такую как идентификатор, имя, роли и т. д.
- После получения токена на клиенте, вы можете сохранить его в памяти или в локальном хранилище (localStorage) и отправлять его в заголовке `Authorization` с каждым запросом на сервер.
- На сервере в приложении Blazor Server вы можете извлечь информацию о пользователе из заголовка `Authorization` и декодировать токен. Вы можете использовать пакет `Microsoft.IdentityModel.Tokens` для декодирования.

2. Хранение данных о пользователе в Blazor Server предоставляет различные варианты. Один из них - использовать сервис `AuthenticationStateProvider`, который является частью Blazor и предоставляет информацию о состоянии аутентификации. Вы можете получить текущее состояние аутентификации и информацию о пользователе, включая имена, роли, идентификаторы и т. д., с помощью `AuthenticationStateProvider`.

3. Хранить данные о пользователе в `HttpContext` как объект `ClaimsIdentity` можно, но в Blazor Server это может быть не самым оптимальным подходом. Вместо этого рекомендуется использовать `AuthenticationStateProvider`, чтобы получить доступ к данным о пользователе в различных компонентах Blazor. Вы можете создать собственную реализацию `AuthenticationStateProvider`, которая будет извлекать и декодировать токен и предоставлять доступ к данным о пользователе через API, доступные в Blazor компонентах.
1. Сохранить, очевидно, например в LocalStorage/Cookie. Получить информацию: взять середину токена (там 3 части, разделенных запятой, а вам нужна как раз 2-ая из них), сделать на этой строке base64 decode и json deserialize, например, и будет вся информация в виде Claim'ов 

2. Данные о пользователе в смысле логин/пароль и пр.? Очевидно, что в базе, а как - на ваше усмотрение, мы используем стандартные возможности EF, просто немного дописанные руками (в т.ч. фио и пр.)

3. Да, мы так тоже делаем, смотреть в сторону IMeddleware
Похожие вопросы