ADFS 4.0에서 간헐적인 OpenID Connect 로그인 오류

ADFS 4.0에서 간헐적인 OpenID Connect 로그인 오류

Azure에서 호스팅되는 Windows 2016 ADFS 4.0 팜(SQL Server가 아닌 WID 데이터베이스)이 있습니다.

우리는 새로운 OpenID Connect 애플리케이션을 사용하고 있으며 ADFS를 사용하여 AD에서 사용자 프로필을 인증하고 채우려고 합니다. 애플리케이션이 JWT 구성에 공유 비밀을 사용하고 있습니다.

테스트 환경(단일 노드 팜)에서는 구성이 매우 쉬웠습니다.

프로덕션 ADFS 서버에 동일한 응용 프로그램 서버를 구성했을 때 처음에는 성공했지만 로그인한 후에는 간헐적으로 로그인 오류가 발생하기 시작했습니다. ADFS에 로그인하면 콜백 URL로 전송됩니다. 그러면 로그인 페이지로 리디렉션되고 해당 페이지에는 다음 오류 메시지가 포함된 모달 대화 상자가 있습니다. Call to IdP failed to get identity

새로 고침을 몇 번 누르면 결국 애플리케이션에서 애플리케이션으로 들어갈 수 있게 됩니다. 잘못된 연결에서 피들러 추적을 실행했을 때 다음 오류가 발견되었습니다.

{"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 앱을 설정할 때 다른 사람들도 이 문제를 겪은 적이 있나요? 이 문제를 어떻게 해결하셨나요?

SAML2 아티팩트 해결은 WID를 사용하는 ADFS 4.0에서 지원되지 않지만 동일한 문제가 OpenID Connect에 적용된다는 내용은 없습니다. 문제에 대한 저의 유일한 추측일 뿐입니다. SQL Server 클러스터를 사용하도록 ADFS를 변환하는 데 비용을 들일 가치가 있습니까?

답변1

다음과 같은 경우 문제가 됩니다.

  1. 여러 노드가 있는 ADFS 팜이 있습니다.
  2. ADFS 노드는 WID(SQLExpress/LocalDB)를 사용하고 있습니다.
  3. 클레임을 발행하도록 구성된 웹 API와 함께 "애플리케이션 그룹"(OIDC 애플리케이션)을 사용합니다.

대부분의 SAML 연결과 달리 OIDC는 IDP에서 직접 데이터를 검색합니다.

ADFS+SQLexpress는 노드 간에 구성만 공유하므로 애플리케이션이 인증한 팜 노드가 아닌 다른 팜 노드에서 토큰을 검색하려고 하면 실패합니다.

빠른 대답은 ADFS를 SQLExpress 구성에서 SQL Server 구현으로 전환하는 것입니다. 그렇게 했을 때 OIDC는 일관되게 일했어요.

이에 대한 문서는 구하기 어렵습니다. 내 출처가 사라졌습니다. 내 노트를 온라인에 올려놓고 기회가 되면 이에 대한 링크를 제공하겠습니다.

더 이상 작동하지 않는 오래된 링크:

관련 정보