代码之家  ›  专栏  ›  技术社区  ›  Monsignor

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

  •  0
  • Monsignor  · 技术社区  · 6 年前

    我使用IdentityServer4(带有Asp.Net核心标识)作为多个应用程序的集中身份验证点。

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

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

    1 回复  |  直到 6 年前
        1
  •  5
  •   Eduard Keilholz    6 年前

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

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

    因此,在您的例子中,您将创建一个名为UserChangedMailAddressIntegrationEvent的事件。然后在你的电子邮件系统中,你订阅了这个活动。一旦收到邮件,你的电子邮件系统就会收到并处理它。

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

    请参见eShopOnContainers示例项目,该项目实现了这种精确的技术 https://github.com/dotnet-architecture/eShopOnContainers

        2
  •  2
  •   Vidmantas Blazevicius    5 年前

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

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

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