提问人:Zach Gardner 提问时间:8/14/2023 更新时间:8/15/2023 访问量:94
在 .NET Core 6 中触发 OAuth2 流,用于具有 JWT 持有者令牌的无状态微服务,无需 cookie 会话
Triggering OAuth2 flow in .NET Core 6 for stateless microservices with JWT bearer tokens, without cookie sessions
问:
我有一个强制执行身份验证的 .NET Core 6 API 网关,然后需要将经过身份验证的请求传递给各个微服务(检查授权)。我想在 API Gateway 层实现 OAuth2 流,并将 302 重定向响应返回到在浏览器会话存储中存储持有者令牌的返回 URL。然后,UI 可以在后续请求中包含持有者令牌和 Authorization 标头。
不过,我遇到的是 OpenIDConnect 流程只允许我使用基于会话的 cookie 来执行此操作。这在无状态微服务实现中并不理想,因为它要求我要么将基于用户的亲和性设置为内存中包含会话存储的 API 网关实例,要么要求我将会话存储委托给外部会话存储(例如 Redis)。
我想尽可能避免会话,但是查看 Microsoft.AspNetCore.Authentication.AuthenticationService,我必须在我的 .AddOpenIdConnect() 选项,唯一实现 IAuthenticationSignInHandler 的是 CookieAuthenticationHandler
如何使 OAuth2 流正常工作(最好是使用 OpenIDConnect),同时能够配置如何将令牌返回给用户,而无需使用基于 cookie 的会话?
答:
启动 OpenID Connect 流的服务实例也应与完成该流的服务实例相同。
关于 Cookie,您可以通过正确配置数据保护 API 来使会话 Cookie 跨服务工作,以便在服务中使用相同的加密密钥。
请参见: 配置 ASP.NET 核心数据保护
多年前,我还在这里写过关于数据保护 API 的博客:
在 Azure Key Vault 中存储 ASP.NET Core Data Protection Key Ring
评论