Однократный выход для OpenID Connect в AD FS

Обзор

На основе начальной поддержки Oauth в AD FS в Windows Server 2012 R2 ad FS 2016 появилась поддержка входа в OpenId Подключение. С КБ 4038801 AD FS 2016 теперь поддерживает единый выход для сценариев openId Подключение. В этой статье представлен обзор сценария единого выхода для OpenId Подключение и приведены рекомендации по его использованию для приложений OpenId Подключение в AD FS.

Документация по обнаружению

OpenID Подключение использует документ JSON с именем "Документ обнаружения" для предоставления сведений о конфигурации. К ним относятся URI проверки подлинности, маркера, userinfo и общедоступных конечных точек. Ниже приведен пример документации по обнаружению.

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

Следующие дополнительные значения будут доступны в документации по обнаружению, чтобы указать поддержку выхода Front Channel:

  • frontchannel_logout_supported: значение будет "true"
  • frontchannel_logout_session_supported: значение будет "true".
  • end_session_endpoint: это URI выхода OAuth, который клиент может использовать для запуска выхода на сервере.

Конфигурация сервера AD FS

Свойство AD FS EnableOAuthLogout будет включено по умолчанию. Это свойство сообщает серверу AD FS, чтобы найти URL-адрес (LogoutURI) с идентификатором безопасности, чтобы инициировать выход на клиент. Если у вас нет КБ 4038801 установлен, можно использовать следующую команду PowerShell:

Set-ADFSProperties -EnableOAuthLogout $true

Примечание.

EnableOAuthLogoutпараметр будет помечен как устаревший после установки КБ 4038801. EnableOAUthLogout всегда будет true и не будет влиять на функциональные возможности выхода.

Примечание.

frontchannel_logout поддерживается только после установки КБ 4038801

Настройка клиента

Клиент должен реализовать URL-адрес, который "выключает" пользователя, вошедшего в систему. Администратор istrator может настроить LogoutUri в конфигурации клиента с помощью следующих командлетов PowerShell.

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

Это LogoutUri URL-адрес, используемый AF FS для выхода пользователя. Для реализации LogoutUriклиента необходимо убедиться, что он очищает состояние проверки подлинности пользователя в приложении, например удаление маркеров проверки подлинности, которые у него есть. AD FS будет просматривать этот URL-адрес с идентификатором безопасности в качестве параметра запроса, сигналив проверяющей стороне или приложению о выходе пользователя из системы.

AD FS log off user diagram

  1. Маркер OAuth с идентификатором сеанса: AD FS включает идентификатор сеанса в токен OAuth во время выдачи маркера id_token. Это будет использоваться позже AD FS для идентификации соответствующих файлов cookie единого входа для очистки пользователя.
  2. Пользователь инициирует выход в App1: пользователь может инициировать выход из любого из зарегистрированных в приложениях. В этом примере пользователь инициирует выход из App1.
  3. Приложение отправляет запрос выхода в AD FS: после запуска выхода приложение отправляет запрос GET в end_session_endpoint AD FS. Приложение может при необходимости включать id_token_hint в качестве параметра в этот запрос. Если id_token_hint присутствует, AD FS будет использовать его вместе с идентификатором сеанса для определения URI клиента, на который следует перенаправить клиент после выхода (post_logout_redirect_uri). Post_logout_redirect_uri должен быть допустимым URI, зарегистрированным в AD FS с помощью параметра RedirectUris.
  4. AD FS отправляет выход в клиенты, вошедший в систему: AD FS использует значение идентификатора сеанса для поиска соответствующих клиентов, в которые входит пользователь. Идентифицированные клиенты отправляют запрос на LogoutUri, зарегистрированный в AD FS, для запуска выхода на стороне клиента.

Вопросы и ответы

Вопрос. Я не вижу параметры frontchannel_logout_supported и frontchannel_logout_session_supported в документе обнаружения.
Ответ. Убедитесь, что на всех серверах AD FS установлены КБ 4038801. Ознакомьтесь с одним выходом в Server 2016 с КБ 4038801.

Вопрос. Я настроил единый выход, как показано в руководстве, но пользователь остается вошедшего в систему на других клиентах.
Ответ. Убедитесь, что LogoutUri для всех клиентов, в которых пользователь вошел в систему. Кроме того, AD FS пытается отправить запрос на выход по зарегистрированной LogoutUri. Клиент должен реализовать логику для обработки запроса и принятия действий для выхода пользователя из приложения.

Вопрос. Если после выхода один из клиентов возвращается в AD FS с допустимым маркером обновления, будет ли AD FS выдавать маркер доступа?
Ответ. Да. Это ответственность клиентского приложения за удаление всех прошедших проверку подлинности артефактов после получения запроса на выход в зарегистрированном LogoutUriрежиме.

Next Steps

Разработка AD FS