Добавить утверждения пользователей после аутентификации на IdentityServer 4

У меня есть следующие проекты:

  1. Identity Server 4 с ASP.NET Identity в качестве пользовательского хранилища для всех пользователей всех моих приложений.
  2. Веб-API .NET Core 5
  3. Приложение Xamarin

Процесс выглядит так:

  1. Пользователь входит в систему из приложения Xamarin (3) и проходит проверку подлинности на IdentityServer (1).
  2. Пользователь получает токен доступа от Identity Server, который содержит дополнительное утверждение
  3. Пользователь делает запрос к веб-API (2), используя токен доступа
  4. Веб-API (2) проверяет собственную базу данных на предмет разрешений пользователей.

---- ВОПРОС / ПРОБЛЕМА ЗДЕСЬ -----

Должен ли веб-API добавлять эти пользовательские утверждения (разрешения) к токену доступа ИЛИ должен ли веб-API всегда проверять базу данных на предмет разрешений пользователя при каждом запросе, сделанном от клиента?

  • Возможно, я мог бы добавить утверждения перед аутентификацией с помощью IdentityServer, но это означало бы, что IdentityServer будет иметь доступ к базе данных веб-API. Я считаю, что это не лучшая практика из-за разделения интересов.

  • Другое решение - ввести механизм кэширования, когда веб-API проверяет токен, чтобы он не всегда проверял базу данных.

  • Используя преобразование утверждений, насколько я понимаю, я могу добавить утверждения только к этому 1 запросу, что означает, что в следующий раз, когда клиент сделает запрос, преобразование утверждений должно произойти снова, поскольку оно не возвращает новый токен доступа пользователю. .

В идеале я бы хотел, чтобы веб-API добавлял утверждения к токену доступа, чтобы веб-API мог доверять этим утверждениям во всех последующих запросах. Однако я не могу найти способ сделать это. Я искал преобразования утверждений, IssueJwtAsync (IdentityServerTools), IProfileService, но я думаю, что ни один из них не является решением этой проблемы.

Это хорошая архитектура? Пожалуйста, поделитесь своим мнением по этому поводу и возможными решениями.

Большое спасибо!


comment
Если вы решите использовать настраиваемый преобразователь претензий, вы можете выполнить кэширование внутри преобразователя претензий. Полное решение здесь: stackoverflow.com/a/63441045/14072498   -  person Roar S.    schedule 13.12.2020


Ответы (1)


Вам необходимо добавить эти разрешения в веб-API, потому что пользователям необходимо получить доступ к соответствующим ресурсам в соответствии с этими предоставленными разрешениями. И разрешения предоставляются, когда пользователь входит в систему в первый раз, без необходимости доступа к базе данных при каждом запросе.

В этом случае вы можете использовать Преобразование претензий. Эта ссылка содержит более подробные инструкции по решению этой проблемы.

person Karney.    schedule 14.12.2020