在 .NET Core 6 中触发 OAuth2 流,用于具有 JWT 持有者令牌的无状态微服务,无需 cookie 会话

Triggering OAuth2 flow in .NET Core 6 for stateless microservices with JWT bearer tokens, without cookie sessions

提问人:Zach Gardner 提问时间:8/14/2023 更新时间:8/15/2023 访问量:94

问:

我有一个强制执行身份验证的 .NET Core 6 API 网关,然后需要将经过身份验证的请求传递给各个微服务(检查授权)。我想在 API Gateway 层实现 OAuth2 流,并将 302 重定向响应返回到在浏览器会话存储中存储持有者令牌的返回 URL。然后,UI 可以在后续请求中包含持有者令牌和 Authorization 标头。

不过,我遇到的是 OpenIDConnect 流程只允许我使用基于会话的 cookie 来执行此操作。这在无状态微服务实现中并不理想,因为它要求我要么将基于用户的亲和性设置为内存中包含会话存储的 API 网关实例,要么要求我将会话存储委托给外部会话存储(例如 Redis)。

我想尽可能避免会话,但是查看 Microsoft.AspNetCore.Authentication.AuthenticationService,我必须在我的 .AddOpenIdConnect() 选项,唯一实现 IAuthenticationSignInHandler 的是 CookieAuthenticationHandler

enter image description here

enter image description here

如何使 OAuth2 流正常工作(最好是使用 OpenIDConnect),同时能够配置如何将令牌返回给用户,而无需使用基于 cookie 的会话?

C# ASP.NET 核心 安全性 openid-connect

评论

0赞 jdweng 8/14/2023
使用 OAUTH2,您可以发送两个请求/响应。第一个请求是在响应中获取令牌,第二个请求是在其中添加令牌的查询。可以使用 Cookie,因此您不必在每次运行应用程序时都获取令牌。您可以使用现有的 cookie,然后只发送一个请求/响应。您不需要使用 cookie,但您必须始终发送两个请求/响应。

答:

0赞 Tore Nestenius 8/15/2023 #1

启动 OpenID Connect 流的服务实例也应与完成该流的服务实例相同。

关于 Cookie,您可以通过正确配置数据保护 API 来使会话 Cookie 跨服务工作,以便在服务中使用相同的加密密钥。

请参见: 配置 ASP.NET 核心数据保护

多年前,我还在这里写过关于数据保护 API 的博客:

在 Azure Key Vault 中存储 ASP.NET Core Data Protection Key Ring

评论

0赞 Zach Gardner 8/29/2023
有趣的博客文章,没有阅读有关数据保护 API 的任何内容。我必须做一些挖掘并让你知道。