Я пытаюсь внедрить Identity Provider, используя в качестве основы IdentityServer4 на ASP.Net Core с небольшими изменениями в предоставленных контекстах для обеспечения изоляции многопользовательской базы данных.Моя цель - поддержать следующие два потока:
- Неявное предоставление
- Предоставление кода авторизации
Я реализовал следующее поведение, которое успешно работает длянеявное предоставление:
- Пользователь получает доступ к приложению SPA и перенаправляется на страницу входа на сервер идентификации
- Пользователь вводит свои учетные данные - адрес электронной почты и пароль, т.е. user@company.com
- После отправки учетных данных я извлекаю имя домена и сохраняю его в файле cookie.Домен необходим в контексте http для получения строки подключения к базе данных, которая потребуется для доступа к правильной базе данных.Все контексты БД, включая PersistentGrantDbContext и ConfigurationDbContext, были изменены для использования этой настраиваемой строки подключения.
- Во время этого сеанса домен доступен через cookie, поэтому все операции с контекстами IdentityServer выполняются нормально, ориентируясь на базу данных, как указаноимя домена.
- Когда поток аутентификации / авторизации завершен, идентификатор домена добавляется в токен доступа через пользовательскую реализацию IProfileService
Проблема с потоком кода авторизации:
Из-за ограничения обнаружения домена по имени пользователя проблема заключается в том, что для потока кода авторизации, когда IdentityServer4 перенаправляет на URL обратного вызова с кодом авторизации, доменное имя, которое я ранее извлек, недольше доступны.Поэтому, когда мой клиент SPA выполняет запрос / connect / token, включая код авторизации для получения токенов доступа и id, идентификатор домена теряется, и поэтому я не могу найти соответствующую строку подключения для подключения к нужной базе данных.
Вопрос:
Как я могу убедиться, что идентификатор домена доступен во время кода авторизации - обмен токенами авторизации?
Есть ли какие-либопримеры как это сделать?
Имеет ли смысл какой-либо из приведенных ниже подходов, и если да, то как?
a.При возврате кода авторизации от identityserver, включите пользовательский параметр запроса, который будет включать идентификатор домена.Когда клиент отправляет код авторизации в / connect / token endpoint, включите полученный параметр в качестве параметра запроса.В этом варианте у нас есть примеры как на стороне клиента, так и на стороне сервера?
b.Кэшируйте доменное имя, используя код авторизации, который содержится в запросе / connect / token.
- Рекомендуется ли это?
- Как identityserver4 может предоставить этот код авторизации?