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

Keeping data in sync between IdentityServer and application

我使用 IdentityServer4(具有 Asp.Net Core Identity)作为多个应用程序的集中授权点。

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

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

一个好的方法是在您的系统中实施集成事件。这是一种引发事件 'This special thing happend' 并允许通知系统其他部分的机制。

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

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

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

请参阅 eShopOnContainers 示例项目,它实现了这种技术 https://github.com/dotnet-architecture/eShopOnContainers

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

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

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