gpt4 book ai didi

windows-services - 消息队列消费者应该如何在微服务环境中模拟 Identity Server 3 中的用户?

转载 作者:行者123 更新时间:2023-12-05 07:15:51 24 4
gpt4 key购买 nike

我们有一个使用 Identity Server 3 的微服务环境。身份通过授权 http header 中的不记名 token 提供给 http 微服务,其中 token 是 JWT。该 JWT 通常代表登录的最终用户,但有时也可以代表已通过客户端凭据流进行身份验证的系统用户。

消息由这些微服务发布到队列 (RabbitMQ) 上,以进行异步处理。目前,我们有一个使用这些消息的 Windows 服务。它使用客户端凭据作为系统用户进行身份验证,并将身份验证 header 中的 JWT 发送到其他 http 微服务。

我们希望在整个流程中维护发布消息的用户的身份,包括在从队列中使用消息时以及消费者调用其他微服务时的机器对机器 (m2m) 通信中。即,当服务 A(由 JWT 提供)向队列发布消息时,Windows 服务应该能够模拟服务 A 的 JWT 中表示的用户,并且应该能够提供表示同一用户的 JWT调用服务 B。

Service A (running as alice) --> RMQ 
RMQ <-- Win Service (running as alice) --> Service B (running as alice)

只有具有正确声明的客户端才能以这种方式模拟用户。

为了将 JWT 返回到 Windows 服务,我应该使用哪个流程?这应该如何在 Identity Server 3 中实现?我已经设法使用资源所有者流程生成 JWT,传入虚拟用户名和密码(覆盖 AuthenticateLocalAsync),尽管我还没有尝试检查 Win 服务的客户端是否具有有效声明冒充。或者这应该是自定义流程,实现 ICustomGrantValidator?也许可以使用客户端凭证流?

请注意,原始 JWT 可以与消息一起提供,或者只是用户 ID 本身。原始的 JWT 可能已经过期,这就是为什么 Windows 服务必须以某种方式重新进行身份验证的原因。

最佳答案

我的理解是,您希望通过分布式架构传播经过身份验证的身份,其中包括通过 RabbitMQ 消息代理进行的异步消息传递。

当您向 RabbitMQ 发送/发布消息时,您可能会考虑在消息 header 中包含 JWT,即类似于将 JWT 包含在 HTTP header 中以调用 protected HTTP 路由。或者,如果您觉得有点懒惰,您可以将 JWT 直接放在消息有效负载上。您的异步(Windows 服务)使用者可以在 JWT 通过时验证它,或者它可能只是在后续 HTTP 请求中将其传递到“其他 http 微服务”的 protected 路由。

我不确定您关于“我应该使用哪个流程”的问题是否相关,因为大概用户已经通过身份验证(通过 OIDC/authN 流程之一,例如身份验证代码授予、隐式、ROPC... ) 并且您只是希望通过分布式架构传播 JWT 以用于 authZ 目的...

在发送自定义消息头方面,我已经使用 RabbitMQ 和 MassTransit 完成了此操作,但它是为了 (OpenTracing) 跟踪异步消息代理操作之间的 Id 传播。 repo 在 GitHub 上 here - 可能会给你一些关于如何实现这一目标的想法......

[编辑] 以下说明:

以下是我能想到的一些选项 - 每个选项都有一些安全隐患:

  1. 为异步(Windows 服务)使用者提供 JWT 签名 key 。如果你沿着这条路走下去使用对称可能更有意义JWT 的签名——任何具有对称 key 的服务都可以重新创建 JWT。您可能仍然可以获得相同的结果通过共享私钥进行非对称签名,但是(IMO)私钥应该只有授权服务器知道(使用非对称签名时)。
  2. 当用户进行身份验证时,通过添加请求刷新 token offline_access 到/token 上指定的范围列表端点。然后,您可以将刷新 token 传递给异步(Windows 服务)消费者,可以使用刷新如果前一个 token 已过期(或每次都获取一个新 token ),则获取新的 token 。您可能需要考虑一些安全因素在走这条路之前请三思。
  3. 增加超时访问 token 的持续时间,以便有足够的时间异步(windows 服务)消费者来处理请求。不知道这对于您的场景是可行的,但也是最简单的选择。

关于windows-services - 消息队列消费者应该如何在微服务环境中模拟 Identity Server 3 中的用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59453896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com