AD FS를 사용한 OpenID Connect 단일 로그아웃

개요

Windows Server 2012 R2의 AD FS에서 초기 Oauth 지원을 기반으로 하는 AD FS 2016에서는 OpenId 커넥트 로그온에 대한 지원이 도입되었습니다. KB4038801 AD FS 2016은 이제 OpenId 커넥트 시나리오에 대한 단일 로그아웃을 지원합니다. 이 문서에서는 OpenId 커넥트 시나리오에 대한 단일 로그아웃에 대한 개요를 제공하고 AD FS의 OpenId 커넥트 애플리케이션에 사용하는 방법에 대한 지침을 제공합니다.

검색 문서

OpenID 커넥트 "검색 문서"라는 JSON 문서를 사용하여 구성에 대한 세부 정보를 제공합니다. 여기에는 인증, 토큰, userinfo 및 퍼블릭 엔드포인트의 URI가 포함됩니다. 다음은 검색 문서의 예입니다.

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

다음 추가 값은 검색 문서에서 프런트 채널 로그아웃에 대한 지원을 나타내는 데 사용할 수 있습니다.

  • frontchannel_logout_supported: 값은 'true'입니다.
  • frontchannel_logout_session_supported: 값은 'true'입니다.
  • end_session_endpoint: 클라이언트가 서버에서 로그아웃을 시작하는 데 사용할 수 있는 OAuth 로그아웃 URI입니다.

AD FS 서버 구성

AD FS 속성 EnableOAuthLogout은 기본적으로 사용하도록 설정됩니다. 이 속성은 클라이언트에서 로그아웃을 시작하기 위해 SID를 사용하여 URL(LogoutURI)을 찾아보도록 AD FS 서버에 지시합니다. KB4038801 설치되지 않은 경우 다음 PowerShell 명령을 사용할 수 있습니다.

Set-ADFSProperties -EnableOAuthLogout $true

참고 항목

EnableOAuthLogout매개 변수는 KB4038801 설치한 후 사용되지 않는 것으로 표시됩니다. EnableOAUthLogout 는 항상 true이며 로그아웃 기능에 영향을 주지 않습니다.

참고 항목

frontchannel_logout KB4038801 설치 후에만 지원됩니다.

클라이언트 구성

클라이언트는 로그인한 사용자를 '로그오프'하는 URL을 구현해야 합니다. 관리istrator는 다음 PowerShell cmdlet을 사용하여 클라이언트 구성에서 LogoutUri를 구성할 수 있습니다.

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

AF LogoutUri FS에서 사용자를 "로그오프"하는 데 사용하는 URL입니다. 구현을 LogoutUri위해 클라이언트는 애플리케이션에서 사용자의 인증 상태를 지워야 합니다(예: 있는 인증 토큰 삭제). AD FS는 SID를 쿼리 매개 변수로 사용하여 해당 URL로 이동하여 신뢰 당사자/애플리케이션이 사용자를 로그오프하도록 신호를 표시합니다.

AD FS log off user diagram

  1. 세션 ID가 있는 OAuth 토큰: AD FS에는 id_token 토큰 발급 시 OAuth 토큰에 세션 ID가 포함됩니다. 이는 나중에 AD FS에서 사용자를 위해 클린 관련 SSO 쿠키를 식별하는 데 사용됩니다.
  2. 사용자가 App1에서 로그아웃을 시작합니다. 사용자는 로그인한 애플리케이션에서 로그아웃을 시작할 수 있습니다. 이 예제 시나리오에서는 사용자가 App1에서 로그아웃을 시작합니다.
  3. 애플리케이션은 AD FS에 로그아웃 요청을 보냅니다. 사용자가 로그아웃을 시작한 후 애플리케이션은 AD FS의 end_session_endpoint GET 요청을 보냅니다. 애플리케이션은 필요에 따라 id_token_hint 이 요청에 대한 매개 변수로 포함할 수 있습니다. id_token_hint 있는 경우 AD FS는 세션 ID와 함께 사용하여 로그아웃 후 클라이언트를 리디렉션해야 하는 URI를 파악합니다(post_logout_redirect_uri). post_logout_redirect_uri RedirectUris 매개 변수를 사용하여 AD FS에 등록된 유효한 URI여야 합니다.
  4. AD FS는 로그인한 클라이언트에 로그아웃을 보냅니다. AD FS는 세션 식별자 값을 사용하여 사용자가 로그인한 관련 클라이언트를 찾습니다. 식별된 클라이언트는 AD FS에 등록된 LogoutUri에 요청을 보내 클라이언트 쪽에서 로그아웃을 시작합니다.

FAQ

Q: 검색 문서에 frontchannel_logout_supported 및 frontchannel_logout_session_supported 매개 변수가 표시되지 않습니다.
A: 모든 AD FS 서버에 KB4038801 설치되어 있는지 확인합니다. KB4038801 있는 Server 2016의 단일 로그아웃을 참조하세요.

Q: 지시대로 단일 로그아웃을 구성했지만 사용자가 다른 클라이언트에서 로그인 상태를 유지합니다.
A: 사용자가 로그인한 모든 클라이언트에 대해 설정되었는지 확인 LogoutUri 합니다. 또한 AD FS는 등록된 LogoutUri로그아웃 요청을 보내는 최상의 시도를 수행합니다. 클라이언트는 요청을 처리하고 애플리케이션에서 사용자를 로그아웃하는 작업을 수행하는 논리를 구현해야 합니다.

Q: 로그아웃 후 클라이언트 중 하나가 유효한 새로 고침 토큰을 사용하여 AD FS로 돌아가면 AD FS에서 액세스 토큰을 발급합니까?
A: 예. 등록된 LogoutUri로그아웃 요청이 수신된 후 모든 인증된 아티팩트를 삭제하는 것은 클라이언트 애플리케이션의 책임입니다.

다음 단계

AD FS 개발