Статья
Тихий 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.