Erro intermitente de login do OpenID Connect no ADFS 4.0

Erro intermitente de login do OpenID Connect no ADFS 4.0

Temos um farm ADFS 4.0 do Windows 2016 (banco de dados WID, não SQL Server) hospedado no Azure.

Estamos trabalhando com um novo aplicativo OpenID Connect e queremos usar ADFS para autenticar e preencher perfis de usuário do AD. O aplicativo está usando um segredo compartilhado para a configuração do JWT.

Isso foi muito fácil de configurar em nosso ambiente de teste (farm de nó único).

Quando configuramos o mesmo servidor de aplicativos em nosso servidor ADFS de produção, inicialmente obtivemos sucesso, mas após o login, começamos a receber erros de login intermitentemente. Depois de fazer login no ADFS, você será direcionado para o URL de retorno de chamada. Isso redireciona você para uma página de login e nessa página há uma caixa de diálogo modal com esta mensagem de erro: Call to IdP failed to get identity

Se clicarmos em atualizar algumas vezes, eventualmente, o aplicativo nos permitirá entrar no aplicativo. Quando executamos um rastreamento do violinista na conexão ruim, encontramos este erro:

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

Encontrei erros no visualizador de eventos ADFS com este tipo de mensagem:

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)

Em todos os casos, conseguimos fazer login depois de clicar em recarregar várias vezes.

Quando reduzimos o número de nós no farm para 1, o problema pareceu desaparecer e reapareceu quando adicionamos novamente os nós.

Outras pessoas se depararam com esse problema ao configurar aplicativos openid connect/oAuth2? Como você resolveu isso?

Embora a resolução de artefato SAML2 não seja suportada no ADFS 4.0 usando WID, não há nada dizendo que o mesmo problema se aplica ao OpenID Connect, embora seja meu único palpite sobre o problema. Vale a pena gastar para converter o ADFS para usar um cluster do SQL Server?

Responder1

Isso é um problema se você:

  1. tenha um farm ADFS com vários nós.
  2. Nós ADFS estão usando WID (SQLExpress/LocalDB)
  3. Usando um "Grupo de Aplicativos" (aplicativo OIDC) com uma API Web configurada para emitir declarações.

Ao contrário da (maioria) das conexões SAML, o OIDC recupera dados diretamente do IDP.

O ADFS+SQLexpress compartilha apenas a configuração entre nós, portanto, se seu aplicativo tentar recuperar tokens de um nó de farm diferente daquele em que você se autenticou, ele falhará.

A resposta rápida é mudar o ADFS de uma configuração SQLExpress para uma implementação do SQL Server. Quando fiz isso, o OIDC funcionou de forma consistente.

É difícil encontrar documentação para isso. Minhas fontes desapareceram, colocarei minhas anotações online e fornecerei um link para elas quando tiver oportunidade.

Links antigos que não funcionam mais:

informação relacionada