Синхронизация данных между IdentityServer и приложением - PullRequest
0 голосов
/ 25 января 2019

Я использую IdentityServer4 (с Asp.Net Core Identity) в качестве централизованной точки авторизации для нескольких приложений.

В одном из приложений я хочу настроить запланированное задание для отправки уведомлений по электронной почте нескольким пользователям. Когда задание будет выполнено, у него не будет доступа к заявкам пользователей (поскольку оно будет выполнено не в контексте одного запроса пользователя) и, следовательно, не будет места для чтения электронной почты пользователя. Это означает, что мне придется дублировать электронные письма в БД приложения.

Но как поддерживать синхронизацию электронной почты между приложением и IdentityServer, если какой-либо пользователь хочет изменить его?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Мы столкнулись с аналогичной проблемой, когда у нас были запущены задания Hangfire, которые извлекали данные отчетов из нашей системы и затем отправляли отчеты по электронной почте группе пользователей, настроенных при создании запланированного задания.

Мы также использовали Identity Server 4 с ASP.Net Identity и в итоге сохранили идентификаторы пользователя в информации о запланированном задании. Затем мы также создали конечную точку API в нашей ASP.Net Identity, которая будет возвращать требуемую информацию о пользователе с указанным идентификатором пользователя (или списком идентификаторов пользователя). Наконец, мы использовали client_credentials и создали клиент для использования этого API во время выполнения задания, который будет извлекать соответствующую информацию о пользователе в данный момент времени из нашего API ASP.Net Identity.

Такой подход до сих пор хорошо работал для нас, и он избавил от необходимости думать о том, как обеспечить синхронизацию данных все вместе.

0 голосов
/ 25 января 2019

Хорошим подходом было бы реализовать интеграционные события в вашей системе.Это механизм, который вызывает событие «Эта особая вещь происходит» и позволяет получать уведомления других частей вашей системы.

Вы можете использовать RabbitMQ или Azure ServiceBus, например, для отправки сообщений.Каждая система, подписавшаяся на такого рода сообщение, получит его.

Таким образом, в вашем случае вы, например, создадите событие с именем UserChangedEmailAddressIntegrationEvent.Затем в вашей системе электронной почты вы подписываетесь на это событие.Как только оно будет создано, ваша система электронной почты получит сообщение и сможет его обработать.

UserChangedEmailAddressIntegrationEvent может фактически быть классом, содержащим (например) два свойства, OldEmail и NewEmail, поэтому система электронной почты знает, чтозначение, которое нужно изменить.

См. пример проекта eShopOnContainers, в котором реализован этот точный метод https://github.com/dotnet-architecture/eShopOnContainers

...