
我們在 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 追蹤時,我們發現了以下錯誤:
{"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 應用程式時是否遇到此問題?你是如何解決這個問題的?
雖然 ADFS 4.0 不支援使用 WID 的 SAML2 工件解析,但沒有任何訊息表明 OpenID Connect 也存在同樣的問題,儘管這是我對此問題的唯一猜測。將 ADFS 轉換為使用 SQL Server 叢集是否值得花費這筆費用?
答案1
如果您滿足以下條件,這就會成為問題:
- 有一個具有多個節點的 ADFS 場。
- ADFS 節點正在使用 WID (SQLExpress/LocalDB)
- 將「應用程式群組」(OIDC 應用程式)與配置為發出聲明的 Web API 結合使用。
與(大多數)SAML 連線不同,OIDC 直接從 IDP 檢索資料。
ADFS+SQLexpress 僅在節點之間共用配置,因此如果您的應用程式嘗試從與您進行身份驗證的節點不同的場節點檢索令牌,它將失敗。
快速的答案是將 ADFS 從 SQLExpress 配置切換到 SQL Server 實作。當我這樣做時,OIDC 始終如一地工作。
這方面的文檔很難取得。我的資料來源已經消失,我會將我的筆記放在網路上,並在有機會時提供指向它的連結。
舊連結不再有效: