Partilhar via


Logon único para OpenID Connect com AD FS

Overview

Com base no suporte inicial ao Oauth no AD FS no Windows Server 2012 R2, o AD FS 2016 introduziu o suporte para o logon do OpenId Connect. Com o KB4038801, o AD FS 2016 agora oferece suporte a logout único para cenários do OpenId Connect. Este artigo fornece uma visão geral do cenário de logout único para o OpenId Connect e fornece orientação 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, userinfo e endpoints públicos. Segue-se 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 o suporte para Logout do Canal Frontal:

  • frontchannel_logout_supported: o valor será 'verdadeiro'
  • frontchannel_logout_session_supported: o valor será 'verdadeiro'.
  • end_session_endpoint: este é o URI de logout do OAuth que o cliente pode usar para iniciar o logout no servidor.

Configuração do servidor AD FS

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

Set-ADFSProperties -EnableOAuthLogout $true

Note

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

Note

frontchannel_logout é suportado somente após a instalação do KB4038801

Configuração do cliente

O cliente precisa implementar uma URL que realiza logoff do utilizador 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 "terminar sessão" do utilizador. 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é essa URL, com o SID como parâmetro de consulta, sinalizando à parte confiável ou aplicativo para terminar a sessão do usuário.

diagrama de logoff de usuário do AD FS

  1. token OAuth com ID de sessão: o AD FS inclui ID de sessão no token OAuth no momento da emissão do token id_token. Isso será usado posteriormente pelo AD FS para identificar os cookies SSO relevantes a serem limpos para o usuário.
  2. Utilizador inicia a sessão de logout no App1: O utilizador pode iniciar o logout a partir de qualquer uma das aplicações conectadas. Neste cenário de exemplo, um usuário inicia um logout do App1.
  3. Aplicativo envia solicitação de logout para o AD FS: Depois que o usuário inicia o logout, o aplicativo envia uma solicitação GET para end_session_endpoint do AD FS. O aplicativo pode, opcionalmente, incluir id_token_hint como 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 descobrir para qual URI o cliente deve ser redirecionado após o logout (post_logout_redirect_uri). O post_logout_redirect_uri deve ser um uri válido registrado no AD FS usando o parâmetro RedirectUris.
  4. pt-PT: O AD FS envia um sinal de saída para os clientes nos quais o utilizador está conectado: O AD FS utiliza o valor do identificador de sessão para localizar os clientes relevantes em que o utilizador está conectado. Os clientes identificados recebem uma solicitação no LogoutUri registrado no AD FS para iniciar um logout no lado do cliente.

FAQs

Não: Não vejo os parâmetros frontchannel_logout_supported e frontchannel_logout_session_supported no documento de descoberta.
Um: Certifique-se de ter KB4038801 instalado em todos os servidores AD FS. Consulte Logon único no Server 2016 com KB4038801.

Não: Eu configurei o logout único conforme indicado, mas o usuário permanece conectado em outros clientes.
Um: Certifique-se de que LogoutUri está definido para todos os clientes onde o usuário está conectado. Além disso, o AD FS faz uma tentativa no melhor cenário de enviar a solicitação de saída no LogoutUriregistrado. O cliente deve implementar lógica para lidar com a solicitação e tomar medidas para fazer o logout do utilizador da aplicação.

Não: Se, após o logout, um dos clientes voltar para o AD FS com um token de atualização válido, o AD FS emitirá um token de acesso?
Um: Sim. É da responsabilidade da aplicação cliente eliminar todos os artefatos autenticados depois que uma solicitação de saída for recebida no LogoutUriregistrado.

Próximas Etapas

Desenvolvimento do AD FS