保持IdentityServer和应用程序之间的数据同步

问题描述 投票:4回答:2

我使用IdentityServer4(带有Asp.Net Core Identity)作为多个应用程序的集中式身份验证点。

在其中一个应用程序中,我想设置一个预定作业,以向多个用户发送电子邮件通知。当作业执行时,它将无法访问用户声明(因为它不会在单个用户请求的上下文中执行),因此将无法从中读取用户的电子邮件。这意味着我将不得不在应用程序数据库中复制电子邮件。

但如果某个用户想要更改它,如何在应用程序和IdentityServer之间保持电子邮件同步?

oauth-2.0 synchronization identityserver4 asp.net-core-identity
2个回答
1
投票

我们遇到了类似的问题,我们运行的Hangfire作业将从我们的系统中提取报告数据,然后通过电子邮件将报告发送给创建预定作业时配置的用户组。

我们还将Identity Server 4与ASP.Net Identity一起使用,最终将用户ID存储在预定的作业信息中。然后,我们还在ASP.Net Identity上创建了一个api端点,该端点将返回给定用户ID(或用户ID列表)所需的用户信息。最后,我们使用client_credentials并创建了一个客户端,在作业执行期间使用该API,从我们的ASP.Net Identity api在给定时间点检索适当的用户信息。

到目前为止,这种方法对我们来说效果很好,它消除了必须考虑如何确保数据同步的痛苦。


4
投票

一种好的方法是在系统中实现集成事件。这是一种引发事件'此特殊事件'的机制,并允许系统的其他部分得到通知。

例如,您可以使用RabbitMQ或Azure ServiceBus向其发送消息。订阅这种消息的每个系统都会收到它。

因此,在您的情况下,您将创建一个名为UserChangedEmailAddressIntegrationEvent的事件。然后在您的电子邮件系统中,您订阅了此事件。一旦它被提出,您的电子邮件系统将收到该消息并能够处理它。

UserChangedEmailAddressIntegrationEvent实际上可以是一个类,包含(例如)两个属性,OldEmail和NewEmail,因此电子邮件系统知道要更改的值。

请参阅eShopOnContainers示例项目,该项目实现了https://github.com/dotnet-architecture/eShopOnContainers

© www.soinside.com 2019 - 2024. All rights reserved.