Error intermitente de inicio de sesión de OpenID Connect en ADFS 4.0

Error intermitente de inicio de sesión de OpenID Connect en ADFS 4.0

Tenemos una granja de Windows 2016 ADFS 4.0 (base de datos WID, no SQL Server) alojada en Azure.

Estamos trabajando con una nueva aplicación OpenID Connect y queremos usar ADFS para autenticar y completar perfiles de usuario desde AD. La aplicación utiliza un secreto compartido para la configuración JWT.

Esto fue muy fácil de configurar en nuestro entorno de prueba (granja de nodos únicos).

Cuando configuramos el mismo servidor de aplicaciones en nuestro servidor ADFS de producción, inicialmente tuvimos éxito, pero después de iniciar sesión, comenzamos a recibir errores de inicio de sesión de forma intermitente. Después de iniciar sesión en ADFS, se le enviará a la URL de devolución de llamada. Esto lo redirige a una página de inicio de sesión y en esa página hay un cuadro de diálogo modal con este mensaje de error: Call to IdP failed to get identity

Si presionamos actualizar varias veces, eventualmente la aplicación nos permitirá ingresar. Cuando ejecutamos un seguimiento de Fiddler en la mala conexión, encontramos este error:

{"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"]}}

Encontré errores en el visor de eventos de ADFS con este tipo de mensaje:

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)

En todos los casos pudimos iniciar sesión después de presionar recargar varias veces.

Cuando redujimos la cantidad de nodos en la granja a 1, el problema pareció desaparecer y reapareció cuando volvimos a agregar los nodos.

¿Otros se han encontrado con este problema al configurar aplicaciones openid connect/oAuth2? Como resolviste esto?

Si bien la resolución de artefactos SAML2 no es compatible con ADFS 4.0 usando WID, no hay nada que diga que el mismo problema se aplica a OpenID Connect, aunque es mi única suposición sobre el problema. ¿Vale la pena el gasto de convertir ADFS para utilizar un clúster de SQL Server?

Respuesta1

Esto es un problema si:

  1. tener una granja ADFS con múltiples nodos.
  2. Los nodos ADFS utilizan WID (SQLExpress/LocalDB)
  3. Uso de "Grupos de aplicaciones" (aplicación OIDC) con una API web configurada para emitir reclamos.

A diferencia de (la mayoría) de las conexiones SAML, OIDC recupera datos directamente del IDP.

ADFS+SQLexpress solo comparte la configuración entre nodos, por lo que si su aplicación intenta recuperar tokens de un nodo de granja diferente al que se autenticó, fallará.

La respuesta rápida es cambiar ADFS de una configuración de SQLExpress a una implementación de SQL Server. Cuando hice eso, OIDC funcionó de manera consistente.

Es difícil conseguir documentación para esto. Mis fuentes han desaparecido, publicaré mis notas en línea y proporcionaré un enlace cuando tenga la oportunidad.

Enlaces antiguos que ya no funcionan:

información relacionada