我有一个强制身份验证的 .NET Core 6 API 网关,然后需要将经过身份验证的请求传递给各个微服务(检查授权)。我想在 API 网关层实现 OAuth2 流,将 302 重定向响应返回到返回 URL,将不记名令牌存储在浏览器的会话存储中。然后,UI 可以将不记名令牌包含在带有授权标头的后续请求中。
我遇到的问题是 OpenIDConnect 流程只允许我使用基于会话的 cookie 来执行此操作。这在无状态微服务实现中并不理想,因为它要求我将基于用户的关联性设置为包含内存中会话存储的 API 网关实例,或者要求我将会话存储委托给外部会话存储(例如, Redis)。
我想尽可能避免会话,但是查看 Microsoft.AspNetCore.Authentication.AuthenticationService 我必须在 .AddOpenIdConnect() 选项中配置 SignInScheme,并且唯一实现 IAuthenticationSignInHandler 的是 CookieAuthenticationHandler
如何让 OAuth2 流程正常工作(最好与 OpenIDConnect 一起使用),同时能够配置如何将令牌返回给用户,而无需使用基于 cookie 的会话?
启动 OpenID Connect 流程的服务实例也应该与完成流程的服务实例相同。
关于 cookie,您可以通过正确配置数据保护 API,使会话 cookie 跨服务工作,以便跨服务使用相同的加密密钥。
我多年前也曾在这里写过关于数据保护 API 的博客: