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

7
我使用IdentityServer4(与Asp.Net Core Identity一起)作为多个应用程序的集中式身份验证点。
在其中一个应用程序中,我想设置定时作业以向多个用户发送电子邮件通知。当作业执行时,它将无法访问用户声明(因为它不是在单个用户请求的上下文中执行),因此将没有地方从中读取用户的电子邮件。这意味着我将不得不在应用程序数据库中复制电子邮件。
但是,如果某个用户想要更改电子邮件地址,如何在应用程序和IdentityServer之间保持电子邮件同步?
2个回答

5
一种好的方法是在您的系统中实现集成事件。这是一种机制,会引发一个事件“发生了这个特殊的事情”,并允许系统中的其他部分得到通知。
例如,您可以使用RabbitMQ或Azure ServiceBus来发送消息。订阅该类消息的每个系统都将收到它。
因此,在您的情况下,您将创建一个名为UserChangedEmailAddressIntegrationEvent的事件。然后在您的邮件系统中,您将订阅这个确切的事件。一旦引发它,您的邮件系统将接收消息并能够处理它。
实际上,UserChangedEmailAddressIntegrationEvent可以是一个类,包含(例如)两个属性OldEmail和NewEmail,以便邮件系统知道要更改的值。
请参见eShopOnContainers示例项目,其中已经实现了这种精确技术:https://github.com/dotnet-architecture/eShopOnContainers

你的回答对于微服务架构来说是完全有效的,但是想象一下我的app1和app2并不是那么紧密地联系在一起。例如,谷歌会将YouTube、Docs、Gmail(以及数百个其他应用程序)连接到单个服务总线吗? - Monsignor

2
我们曾经遇到过类似的问题,我们有Hangfire任务在运行,这些任务会从我们的系统中提取报告数据,然后将报告通过预定的方式发送给配置好的用户集合。
我们还使用了Identity Server 4和ASP.Net Identity,并最终将用户ID存储在预定的作业信息中。之后,我们还在ASP.Net Identity上创建了一个API端点,可以根据用户ID(或用户ID列表)返回所需的用户信息。最后,我们使用了client_credentials并创建了一个客户端来消费该API,在作业执行期间从我们的ASP.Net Identity API检索适当的用户信息。
这种方法对我们来说非常有效,它消除了考虑如何确保数据同步的麻烦。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接