我们在 Azure 中托管一个 Windows 2016 ADFS 4.0 场(WID 数据库,而不是 SQL Server)。
我们正在使用一款新的 OpenID Connect 应用程序,并希望使用 ADFS 来验证 AD 中的用户资料并填充这些资料。该应用程序使用共享密钥进行 JWT 配置。
在我们的测试环境(单节点场)中这非常容易配置。
当我们在生产 ADFS 服务器上配置相同的应用程序服务器时,我们最初是成功的,但登录后,我们开始间歇性地收到登录错误。登录 ADFS 后,您将被发送到回调 URL。这会将您重定向到登录页面,该页面上有一个模式对话框,其中包含以下错误消息: Call to IdP failed to get identity
如果我们多次点击刷新,最终应用程序将允许我们进入应用程序。当我们在坏连接上运行 fiddler trace 时,我们发现了此错误:
{"errorCodeString":"camAuthUnrecoverable",
"messages":[{"messageString":"Call to IdP failed to get identity. Status 400\nError: invalid_grant\nError description: MSIS9612: The authorization code received in 'code' parameter is invalid. "}],
"promptInfo":{"captions":["Call to IdP failed to get identity"]}}
我在 ADFS 事件查看器中发现了以下错误消息:
Encountered error during OAuth token request.
Additional Data
Exception details:
Microsoft.IdentityServer.Web.Protocols.OAuth.Exceptions.OAuthAccessTokenInvalidAuthorizationCodeException:
MSIS9252: The authorization code received is invalid.
No artifact found for the specified authorization code: '//redacted//'.
The cause may be that artifact has timed out, or the authorization code was replayed, or the authorization code is invalid.
at Microsoft.IdentityServer.Web.Protocols.OAuth.OAuthToken.OAuthTokenProtocolHandler.RedeemAccessToken(OAuthAccessTokenRequestContext tokenContext)
在每种情况下,我们都能够在多次重新加载后登录。
当我们将服务器场中的节点数减少到 1 时,问题似乎消失了,而当我们重新添加节点时,问题又再次出现。
其他人在设置 openid connect/oAuth2 应用时遇到过这个问题吗?您是如何解决这个问题的?
虽然使用 WID 的 ADFS 4.0 不支持 SAML2 工件解析,但没有任何证据表明同样的问题也适用于 OpenID Connect,尽管这是我对该问题的唯一猜测。将 ADFS 转换为使用 SQL Server 群集是否值得花费?
答案1
如果您符合以下情况,则会出现问题:
- 拥有一个包含多个节点的 ADFS 场。
- ADFS 节点正在使用 WID (SQLExpress/LocalDB)
- 使用配置了 Web API 的“应用程序组”(OIDC 应用程序)来发出声明。
与(大多数) SAML 连接不同,OIDC 直接从 IDP 检索数据。
ADFS+SQLexpress 仅在节点之间共享配置,因此如果您的应用程序尝试从与您进行身份验证的场节点不同的场节点检索令牌,它将失败。
快速答案是将 ADFS 从 SQLExpress 配置切换到 SQL Server 实现。当我这样做时,OIDC 始终正常工作。
这方面的文档很难找到。我的资料已经消失了,我会把我的笔记放到网上,有机会的话会提供链接。
不再有效的旧链接: