如何使用 OpenIddict 验证处理程序交换令牌的授权代码并从 cookie 中检索存储的令牌?

问题描述

我的问题实际上是两个问题,但它们彼此密切相关,因为我觉得我错过了一些非常简单的东西。

我在 ASP.NET Core 上有一个 OpenIddict 身份验证服务器(工作正常),我有一个带有 ASP.NET Core WebAPI 资源服务器的 SPA 与这个身份验证服务器一起工作,资源服务器使用 OpenIddict 验证处理程序(又名services.AddOpenIddict().AddValidation())。 SPA 正在使用带有 PKCE 的授权代码流 - 也没有任何问题。令牌通过 Authorization: Bearer 标头发送,一切都应该如此。

现在我需要连接到这个身份验证服务器的另一个服务 - 这不是一个 SPA,而是一个通用的 MVC ASP.NET Core 应用程序。我想到了这个设置:

  1. 客户端(也称为浏览器)请求服务服务器并根据授权代码重定向到 Auth 服务器。
  2. 客户端在身份验证服务器上进行身份验证,接收授权代码重定向到服务服务器。
  3. 服务服务器接收 AuthCode 并在内部将其交换为访问(和刷新)令牌(不使用客户端),并且当它收到它们时,在客户端上设置了两个 cookie - 一个用于访问令牌的会话,以及刷新令牌的永久令牌(具有路径限制)。我使用的是加密令牌,所以这里没有信息泄露。
  4. 客户端向所有后续请求发送 cookie,服务根据 cookie(而不是 Authorization 标头)验证它们,一切顺利。

现在,我想重用与我的 SPA 相同的堆栈,也就是 services.AddOpenIddict().AddValidation(),但我不知道如何:

  1. 交换令牌的验证码?我是否需要手动执行此操作,还是缺少有关如何使用验证处理程序的一些重要信息?即使我确实手动请求或使用其他库 - 如何在 OpenIddict 的验证处理程序的帮助下手动验证收到的令牌?
  2. 验证来自 cookie 的令牌而不是 Authorization: Bearer 标头?我是否需要注册一个事件处理程序(又名 opts.AddEventHandler<ProcessAuthenticationContext>(...),做一些类似于 here 所做的事情)? 请参阅下面的评论,我想我解决了这个问题。

也许我还缺少一些东西,我需要以某种方式利用 services.AddAuthentication().AddCookie(...) 机制?如果是这样,我如何使其与 services.AddOpenIddict().AddValidation() 一起使用?

或者我想要的东西不能在 OpenIddict 验证处理程序的帮助下完成,我只需要使用不同的东西?但如果是这样,我如何解密令牌然后将其与其他 OpenIDConnect 库一起使用?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)