我将IdentityServer4(具有Asp.Net核心身份)用作多个应用程序的集中式身份验证点。
在一个应用程序中,我想设置一个计划的作业,以向多个用户发送电子邮件通知。当作业将执行时,它将无法访问用户声明(因为它不会在单个用户请求的上下文中执行),因此将没有地方读取用户的电子邮件。这意味着我将不得不在应用程序数据库中复制电子邮件。
但是,如果某些用户想要更改应用程序和IdentityServer之间的电子邮件,该如何使其保持同步?
答案 0 :(得分:4)
一个好的方法是在系统中实现集成事件。这是一种引发“此特殊事件已发生”事件并允许通知系统其他部分的机制。
例如,您可以使用RabbitMQ或Azure ServiceBus向其发送消息。订阅这种消息的每个系统都将收到它。
因此,在您的情况下,您将创建一个名为UserChangedEmailAddressIntegrationEvent的事件。然后,在您的电子邮件系统中,您预订此事件。提出后,您的电子邮件系统将收到该消息并能够对其进行处理。
UserChangedEmailAddressIntegrationEvent实际上可以是一个类,包含(例如)两个属性,OldEmail和NewEmail,因此电子邮件系统知道要更改的值。
请参阅eShopOnContainers示例项目,该示例实现了此确切技术 https://github.com/dotnet-architecture/eShopOnContainers
答案 1 :(得分:1)
我们遇到了类似的问题,我们运行的Hangfire作业会从我们的系统中提取报告数据,然后将报告通过电子邮件发送给在创建计划作业时配置的一组用户。
我们还将Identity Server 4与ASP.Net Identity一起使用,最终将用户ID存储在计划的作业信息中。然后,我们还在ASP.Net Identity上创建了一个api端点,该端点将在给定用户ID(或用户ID的列表)的情况下提供所需的用户信息。最后,我们使用client_credentials
并创建了一个客户端以在作业执行过程中使用该api,该客户端将从给定的时间点从ASP.Net Identity api中检索适当的用户信息。
到目前为止,这种方法对我们来说效果很好,它消除了不得不考虑如何确保数据同步的痛苦。