Partilhar via


Logon único do OpenID Connect com o AD FS

Visão geral

Com base no suporte inicial do Oauth no AD FS no Windows Server 2012 R2, o AD FS 2016 introduziu o suporte para logon do OpenId Connect. Com o KB4038801, o AD FS 2016 agora dá suporte ao logon único para cenários do OpenId Connect. Este artigo fornece uma visão geral do cenário de logon único do OpenId Connect e fornece diretrizes sobre como usá-lo para seus aplicativos OpenId Connect no AD FS.

Documento de descoberta

O OpenID Connect usa um documento JSON chamado "Documento de descoberta" para fornecer detalhes sobre a configuração. Isso inclui URIs de autenticação, token, informação de usuário e pontos de extremidade públicos. Veja a seguir um exemplo do documento de descoberta.

{
"issuer":"https://fs.fabidentity.com/adfs",
"authorization_endpoint":"https://fs.fabidentity.com/adfs/oauth2/authorize/",
"token_endpoint":"https://fs.fabidentity.com/adfs/oauth2/token/",
"jwks_uri":"https://fs.fabidentity.com/adfs/discovery/keys",
"token_endpoint_auth_methods_supported":["client_secret_post","client_secret_basic","private_key_jwt","windows_client_authentication"],
"response_types_supported":["code","id_token","code id_token","id_token token","code token","code id_token token"],
"response_modes_supported":["query","fragment","form_post"],
"grant_types_supported":["authorization_code","refresh_token","client_credentials","urn:ietf:params:oauth:grant-type:jwt-bearer","implicit","password","srv_challenge"],
"subject_types_supported":["pairwise"],
"scopes_supported":["allatclaims","email","user_impersonation","logon_cert","aza","profile","vpn_cert","winhello_cert","openid"],
"id_token_signing_alg_values_supported":["RS256"],
"token_endpoint_auth_signing_alg_values_supported":["RS256"],
"access_token_issuer":"http://fs.fabidentity.com/adfs/services/trust",
"claims_supported":["aud","iss","iat","exp","auth_time","nonce","at_hash","c_hash","sub","upn","unique_name","pwd_url","pwd_exp","sid"],
"microsoft_multi_refresh_token":true,
"userinfo_endpoint":"https://fs.fabidentity.com/adfs/userinfo",
"capabilities":[],
"end_session_endpoint":"https://fs.fabidentity.com/adfs/oauth2/logout",
"as_access_token_token_binding_supported":true,
"as_refresh_token_token_binding_supported":true,
"resource_access_token_token_binding_supported":true,
"op_id_token_token_binding_supported":true,
"rp_id_token_token_binding_supported":true,
"frontchannel_logout_supported":true,
"frontchannel_logout_session_supported":true
}

Os seguintes valores adicionais estarão disponíveis no documento de descoberta para indicar suporte para Logoff do Front Channel:

  • frontchannel_logout_supported: o valor será 'true'
  • frontchannel_logout_session_supported: o valor será 'true'
  • end_session_endpoint: esse é o URI de logoff OAuth que o cliente pode usar para iniciar o logoff no servidor.

Configuração do servidor do AD FS

A propriedade AD FS EnableOAuthLogout será habilitada por padrão. Essa propriedade informa ao servidor do AD FS para procurar o URL (LogoutURI) com o SID para iniciar o logoff no cliente. Se você não tiver KB4038801 instalado, poderá usar o seguinte comando do PowerShell:

Set-ADFSProperties -EnableOAuthLogout $true

Nota

EnableOAuthLogout parâmetro será marcado como obsoleto após a instalação do KB4038801. EnableOAUthLogout sempre será verdadeira e não terá nenhum impacto na funcionalidade de logout.

Nota

frontchannel_logout tem suporte somente após a instalação do KB4038801

Configuração do cliente

O cliente precisa implementar um URL que 'faz logoff' do usuário conectado. O administrador pode configurar o LogoutUri na configuração do cliente usando os seguintes cmdlets do PowerShell.

  • (Add | Set)-AdfsNativeApplication
  • (Add | Set)-AdfsServerApplication
  • (Add | Set)-AdfsClient
Set-AdfsClient -LogoutUri <url>

O LogoutUri é a URL usada pelo AF FS para deslogar o usuário. Para implementar o LogoutUri, o cliente precisa garantir que ele limpe o estado de autenticação do usuário no aplicativo, por exemplo, descartando os tokens de autenticação que ele tem. O AD FS navegará até esse URL, com o SID como o parâmetro de consulta, sinalizando a terceira parte confiável/aplicativo para fazer logoff do usuário.

Diagrama de usuário de logoff do AD FS

  1. Token OAuth com ID de sessão: o AD FS inclui a ID da sessão no token OAuth no momento da emissão de token id_token. Isso será usado posteriormente pelo AD FS para identificar os cookies de SSO relevantes a serem limpos para o usuário.
  2. O usuário inicia o logoff no App1: o usuário pode iniciar um logoff de qualquer um dos aplicativos conectados. Neste cenário de exemplo, um usuário inicia um logoff do App1.
  3. Aplicativo envia solicitação de logoff ao AD FS: depois que o usuário inicia o logoff, o aplicativo envia uma solicitação GET para end_session_endpoint do AD FS. Opcionalmente, o aplicativo pode incluir id_token_hint como um parâmetro para essa solicitação. Se id_token_hint estiver presente, o AD FS o usará em conjunto com a ID da sessão para determinar para qual URI o cliente deve ser redirecionado após logout (post_logout_redirect_uri). A post_logout_redirect_uri deve ser um URI válido registrado com o AD FS usando o parâmetro RedirectUris.
  4. AD FS envia comando de logout para clientes com sessões ativas: o AD FS utiliza o valor do identificador de sessão para encontrar os clientes relevantes nos quais o usuário está conectado. Os clientes identificados são enviados solicitação no LogoutUri registrado com o AD FS para iniciar um logoff no lado do cliente.

Perguntas frequentes

Pergunta: Eu não vejo os parâmetros frontchannel_logout_supported e frontchannel_logout_session_supported no documento de descoberta.
Resposta: Verifique se você tem oKB4038801 instalado em todos os servidores do AD FS. Consulte Logon único no Server 2016 com o KB4038801.

Pergunta: Eu configurei o logoff único conforme indicado, mas o usuário permanece conectado em outros clientes.
Resposta: Verifique se LogoutUri está definido para todos os clientes em que o usuário está conectado. Além disso, o AD FS faz uma tentativa de melhor caso para enviar a solicitação de saída no registrado LogoutUri. O cliente deve implementar a lógica para lidar com a solicitação e tomar medidas para desconscrever o usuário do aplicativo.

Pergunta: Se, após o logoff, um dos clientes voltar para o AD FS com um token de atualização válido, o AD FS emitirá um token de acesso?
Resposta: Sim. É responsabilidade do aplicativo cliente descartar todos os artefatos autenticados depois que uma solicitação de saída foi recebida no registrado LogoutUri.

Próximas etapas

Desenvolvimento do AD FS