Logoff único para OpenID Connect com o AD FS
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 os aplicativos do OpenId Connect no AD FS.
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. Confira 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.
A propriedade EnableOAuthLogout do AD FS 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 o KB4038801 instalado, poderá usar o seguinte comando do PowerShell:
Set-ADFSProperties -EnableOAuthLogout $true
Observação
O parâmetro EnableOAuthLogout
será marcado como obsoleto após a instalação do KB4038801. EnableOAUthLogout
sempre será verdadeiro e não terá nenhum impacto na funcionalidade de logoff.
Observação
frontchannel_logout só tem suporte após a instalação do KB4038801
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
é o URL usado pelo AF FS para "fazer logoff" do 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.
- 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.
- 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.
- O aplicativo envia uma solicitação de logoff para o 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 descobrir para qual URI o cliente deve ser redirecionado após o logoff (post_logout_redirect_uri). O post_logout_redirect_uri deve ser um URI válido registrado com o AD FS usando o parâmetro RedirectUris.
- O AD FS envia a saída para clientes conectados: o AD FS usa o valor do identificador de sessão para localizar os clientes relevantes aos 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.
Pergunta: 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: 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 sair do 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
.