CorBlogкейсы · ops

Статья

Тихий SSO в Пассворк через AD FS и WIA

Форма на IdP уже была — довёл до входа без пароля: Windows Auth в Intranet, User-Agent для Chromium и allowlist браузера на FQDN AD FS.

Нужен был бесшовный SSO в Пассворк через AD FS: пользователь при входе через SSO должен не видить форму авторизации. Базовый SAML между Пассворк ↔ AD FS уже работал. Для WIA остались три этапа: сказать AD FS, что хотим Windows auth, научить IdP отдавать WIA современным браузерам, разрешить браузеру тихий Negotiate на FQDN AD FS.

Кто что делает

Участник Роль
Пассворк SP
AD FS IdP
Браузер Integrated Auth на FQDN AD FS

Порядок:

  • JSON в Пассворке;
  • Intranet WIA и User-Agent на AD FS;
  • GPO allowlist на клиентах.

Пример имён:

Роль Значение
Пассворк pwk.example.com
AD FS adfs.example.com

До Kerberos/WIA уже должны работать: SAML между Пассворк ↔ AD FS с формой, клиенты в домене, DNS и TLS AD FS доверенны.

Пассворк: RequestedAuthnContext

В AuthnRequest уходит контекст Windows-аутентификации. AD FS видит запрос на WIA вместо обычной forms-схемы. Решение делать WIA или fallback всё равно принимает AD FS.

В Пассворке — Дополнительные настройки:

{
  "sp": {
    "entityId": "https://pwk.example.com/api/v1/sso/metadata",
    "assertionConsumerService": {
      "url": "https://pwk.example.com/api/v1/sso/acs"
    },
    "singleLogoutService": {
      "url": "https://pwk.example.com/api/v1/sso/sls"
    }
  },
  "NameIDFormat": "urn:oasis:names:tc:SAML:2.0:nameid-format:transient",
  "security": {
    "requestedAuthnContext": ["urn:federation:authentication:windows"]
  }
}

AD FS: Intranet WIA и User-Agent

WIA доступен, только если в политике аутентификации для Intranet включён Windows Authentication:

Get-AdfsGlobalAuthenticationPolicy |
  Format-List PrimaryIntranetAuthenticationProvider, PrimaryExtranetAuthenticationProvider

В PrimaryIntranetAuthenticationProvider должен быть WindowsAuthentication. Рядом Forms или Microsoft Passport — нормально, нужен именно Windows в intranet-списке:

PrimaryIntranetAuthenticationProvider : {WindowsAuthentication, FormsAuthentication, MicrosoftPassportAuthentication}

Endpoint WIA (/adfs/ls/wia) включается, только если User-Agent попал в WIASupportedUserAgents. Chromium (Edg/, Chrome/, YaBrowser/) нужно добавить явно. Префикс ~ в значении AD FS — regex.

Браузер Regex
Edge (Chromium) ~Windows\s*NT.*Edg.*
Chrome ~Windows\s*NT.*Chrome.*
Yandex Browser ~Windows\s*NT.*YaBrowser.*
$agents = [System.Collections.ArrayList](Get-AdfsProperties).WIASupportedUserAgents

$needed = @(
  '~Windows\s*NT.*Edg.*',
  '~Windows\s*NT.*Chrome.*',
  '~Windows\s*NT.*YaBrowser.*'
)

foreach ($ua in $needed) {
  if ($agents -notcontains $ua) {
    [void]$agents.Add($ua)
  }
}

Set-AdfsProperties -WIASupportedUserAgents $agents
(Get-AdfsProperties).WIASupportedUserAgents

SPN службы adfssrv

Если /wia есть, но браузер показывает окно Windows Security, часто Kerberos-билет выдан на одну учётку, а adfssrv крутится под другой. SPN http/<FQDN-AD-FS> должен быть на той же записи, что в StartName у adfssrv (синтаксис http/fqdn, не http://fqdn):

Get-CimInstance Win32_Service -Filter "Name='adfssrv'" |
  Select-Object Name, StartName, State
setspn -Q http/adfs.example.com

Клиент: GPO / реестр Chromium

Даже при корректном AD FS браузер по умолчанию не отдаёт доменные credentials любому сайту. Нужно в allowlist браузеров указать — FQDN AD FS. Value data без https://. Это лучше раздавать через GPO → Computer Configuration → Preferences → Windows Settings → Registry → New → Registry Item.

После применения на клиенте выполнить — gpupdate /force, перезапустить браузеры и проверить:

  • Edge — edge://policy
  • Chrome — chrome://policy
  • Yandex — browser://policy

Google Chrome

Создать два Registry Item:

Computer Configuration
  Preferences
    Windows Settings
      Registry
        New → Registry Item

Первый item:

Action: Update
Hive: HKEY_LOCAL_MACHINE
Key Path: SOFTWARE\Policies\Google\Chrome
Value name: AuthNegotiateDelegateAllowlist
Value type: REG_SZ
Value data: adfs.example.com

Второй item:

Action: Update
Hive: HKEY_LOCAL_MACHINE
Key Path: SOFTWARE\Policies\Google\Chrome
Value name: AuthServerAllowlist
Value type: REG_SZ
Value data: adfs.example.com

Microsoft Edge

Computer Configuration
  Preferences
    Windows Settings
      Registry
        New → Registry Item

Первый item:

Action: Update
Hive: HKEY_LOCAL_MACHINE
Key Path: SOFTWARE\Policies\Microsoft\Edge
Value name: AuthNegotiateDelegateAllowlist
Value type: REG_SZ
Value data: adfs.example.com

Второй item:

Action: Update
Hive: HKEY_LOCAL_MACHINE
Key Path: SOFTWARE\Policies\Microsoft\Edge
Value name: AuthServerAllowlist
Value type: REG_SZ
Value data: adfs.example.com

Yandex Browser

Computer Configuration
  Preferences
    Windows Settings
      Registry
        New → Registry Item

Первый item:

Action: Update
Hive: HKEY_LOCAL_MACHINE
Key Path: SOFTWARE\Policies\YandexBrowser
Value name: AuthNegotiateDelegateAllowlist
Value type: REG_SZ
Value data: adfs.example.com

Второй item:

Action: Update
Hive: HKEY_LOCAL_MACHINE
Key Path: SOFTWARE\Policies\YandexBrowser
Value name: AuthServerAllowlist
Value type: REG_SZ
Value data: adfs.example.com

Итог

WIA для Пассворка — это цепочка SP → IdP → браузер: RequestedAuthnContext с Windows, Windows Authentication в Intranet, современный User-Agent в WIASupportedUserAgents и allowlist на FQDN AD FS.