AD FS и Single Sign-On в Windows Server: настройка SSO — АйТи Фреш

AD FS и Single Sign-On в Windows Server: настройка SSO

Что такое AD FS и зачем нужен SSO

AD FS (Active Directory Federation Services) — это роль Windows Server, которая реализует Single Sign-On для веб-приложений и облачных сервисов. Суть простая: пользователь один раз вводит логин и пароль от домена — и дальше ходит по приложениям без повторной аутентификации. Работает и для внутренних корпоративных систем, и для внешних SaaS-сервисов.

AD FS говорит на всех актуальных языках федерации: SAML 2.0, WS-Federation, OAuth 2.0, OpenID Connect. На практике это означает, что вы без особых усилий подключите Office 365, Salesforce, AWS, GitLab, Jira, Confluence — и вообще любой сервис с поддержкой SAML или OIDC. Таких приложений уже тысячи.

По архитектуре AD FS выступает Identity Provider-ом (IdP). Схема работы выглядит так: пользователь идёт в приложение (Service Provider / Relying Party), то перенаправляет его на страницу входа AD FS, AD FS проверяет учётку через Active Directory, выдаёт токен — SAML assertion или JWT — и отправляет обратно в приложение уже с подтверждённой личностью. Всё это происходит за секунды и незаметно для пользователя.

Требования к инфраструктуре

Что понадобится для боевого развёртывания AD FS:

  • Windows Server 2019/2022 — член домена Active Directory
  • SSL-сертификат — от публичного CA (Let's Encrypt, DigiCert) для FQDN вида adfs.company.ru
  • DNS-запись — A-запись adfs.company.ru → IP сервера AD FS
  • Service Account — gMSA (Group Managed Service Account) для службы AD FS
  • Дополнительно: WAP (Web Application Proxy) — если нужен доступ снаружи без VPN

По железу минимум такой: 4 ядра, 8 ГБ RAM, 100 ГБ диск. Если нужна отказоустойчивость — два AD FS-сервера за балансировщиком и SQL Server для хранения конфигурации вместо встроенной WID.

Установка AD FS на Windows Server

Сначала разберёмся с подготовкой: импортируем SSL-сертификат и создаём сервисную учётную запись.

# PowerShell: создание gMSA для AD FS
# На контроллере домена:
Add-KdsRootKey -EffectiveImmediately
New-ADServiceAccount -Name "svc-adfs" -DNSHostName "adfs.company.ru" `
  -PrincipalsAllowedToRetrieveManagedPassword "ADFS-Server$"

# На AD FS сервере: установка gMSA
Install-ADServiceAccount -Identity "svc-adfs"
Test-ADServiceAccount -Identity "svc-adfs"
# True

Установка роли AD FS:

# Установка роли
Install-WindowsFeature -Name ADFS-Federation -IncludeManagementTools

# Импорт SSL-сертификата (если ещё не установлен)
Import-PfxCertificate -FilePath C:\certs\adfs.company.ru.pfx `
  -CertStoreLocation Cert:\LocalMachine\My -Password (ConvertTo-SecureString -String "CertPass" -AsPlainText -Force)

# Получение thumbprint сертификата
$cert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object { $_.Subject -like "*adfs.company.ru*" }
$cert.Thumbprint

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

Запускаем мастер настройки через PowerShell:

# Настройка первого сервера AD FS в ферме
Install-AdfsFarm `
  -CertificateThumbprint $cert.Thumbprint `
  -FederationServiceDisplayName "Company SSO" `
  -FederationServiceName "adfs.company.ru" `
  -GroupServiceAccountIdentifier "DOMAIN\svc-adfs$" `
  -OverwriteConfiguration

# Проверка работоспособности
Get-AdfsProperties | Select-Object HostName, FederationServiceName, Identifier

# Endpoint метаданных (должен быть доступен по HTTPS):
# https://adfs.company.ru/FederationMetadata/2007-06/FederationMetadata.xml

# Проверка из браузера:
# https://adfs.company.ru/adfs/ls/IdpInitiatedSignOn.aspx
# Должна отобразиться страница входа

Настройка SAML-федерации для веб-приложений

Теперь добавляем приложение — Relying Party Trust — для SAML-аутентификации. Разберём на конкретном примере: интеграция с корпоративным GitLab.

# Добавление Relying Party через метаданные
Add-AdfsRelyingPartyTrust `
  -Name "GitLab" `
  -MetadataUrl "https://gitlab.company.ru/users/auth/saml/metadata" `
  -IssuanceAuthorizationRules '@RuleTemplate = "AllowAllAuthzRule" => issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true");'

# Или вручную (если метаданные недоступны)
Add-AdfsRelyingPartyTrust `
  -Name "Custom App" `
  -Identifier "https://app.company.ru/saml" `
  -SamlEndpoint (New-AdfsSamlEndpoint -Binding POST -Protocol SAMLAssertionConsumer `
    -Uri "https://app.company.ru/saml/acs") `
  -IssuanceAuthorizationRules '@RuleTemplate = "AllowAllAuthzRule" => issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true");'

Настраиваем Claim Rules — то есть указываем, какие атрибуты из AD передавать в приложение:

# Правила трансформации Claims
$rules = @'
@RuleName = "Send LDAP Attributes"
c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", 
   Issuer == "AD AUTHORITY"]
=> issue(store = "Active Directory", 
   types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress",
            "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname",
            "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname",
            "http://schemas.xmlsoap.org/claims/Group"),
   query = ";mail,givenName,sn,tokenGroups;{0}", 
   param = c.Value);

@RuleName = "Send NameID"
c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"]
=> issue(Type = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier",
   Issuer = c.Issuer, Value = c.Value,
   Properties["http://schemas.xmlsoap.org/ws/2005/05/identity/claimproperties/format"] = 
   "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress");
'@

Set-AdfsRelyingPartyTrust -TargetName "GitLab" -IssuanceTransformRules $rules

Федерация AD FS с Office 365

Интеграция с Microsoft 365 — пожалуй, самый частый запрос, с которым к нам приходят клиенты. Позволяет входить в Office 365 с корпоративными учётными данными Active Directory, без отдельных облачных паролей:

# Установка модуля Azure AD (MSOnline)
Install-Module -Name MSOnline -Force
Connect-MsolService

# Конвертация домена в федеративный
Set-MsolDomainAuthentication `
  -DomainName "company.ru" `
  -Authentication Federated `
  -ActiveLogOnUri "https://adfs.company.ru/adfs/services/trust/2005/usernamemixed" `
  -PassiveLogOnUri "https://adfs.company.ru/adfs/ls/" `
  -MetadataExchangeUri "https://adfs.company.ru/adfs/services/trust/mex" `
  -SigningCertificate (Get-Content C:\certs\adfs-token-signing.cer -Raw) `
  -IssuerUri "http://adfs.company.ru/adfs/services/trust" `
  -LogOffUri "https://adfs.company.ru/adfs/ls/?wa=wsignout1.0" `
  -PreferredAuthenticationProtocol SAMLP

# Проверка
Get-MsolDomainFederationSettings -DomainName "company.ru"

# Или используйте модуль Azure AD Connect (рекомендуется):
# Azure AD Connect автоматически настраивает федерацию
# при выборе метода "Federation with AD FS"

Настройка Web Application Proxy для доступа извне

WAP (Web Application Proxy) публикует AD FS наружу — мобильные пользователи и внешние приложения получают SSO без VPN:

# На отдельном сервере в DMZ (не в домене!)
Install-WindowsFeature -Name Web-Application-Proxy -IncludeManagementTools

# Импорт того же SSL-сертификата
Import-PfxCertificate -FilePath C:\certs\adfs.company.ru.pfx `
  -CertStoreLocation Cert:\LocalMachine\My `
  -Password (ConvertTo-SecureString -String "CertPass" -AsPlainText -Force)

# Настройка WAP
Install-WebApplicationProxy `
  -CertificateThumbprint $cert.Thumbprint `
  -FederationServiceName "adfs.company.ru" `
  -FederationServiceTrustCredential (Get-Credential)
  # Введите учётные данные доменного администратора

# Публикация AD FS через WAP
Add-WebApplicationProxyApplication `
  -Name "ADFS" `
  -ExternalUrl "https://adfs.company.ru/" `
  -BackendServerUrl "https://adfs.company.ru/" `
  -ExternalCertificateThumbprint $cert.Thumbprint `
  -ExternalPreauthentication PassThrough

OAuth 2.0 и OpenID Connect в AD FS

В Windows Server 2019/2022 AD FS нормально работает с OAuth 2.0 и OpenID Connect. Это открывает интеграцию с современными SPA и мобильными приложениями — не только с классическими корпоративными системами:

# Создание Application Group для OAuth/OIDC
Add-AdfsApplicationGroup -Name "Intranet Portal" -ApplicationGroupIdentifier "IntranetPortal"

# Регистрация Server Application (backend/confidential client)
Add-AdfsServerApplication `
  -Name "Portal Backend" `
  -ApplicationGroupIdentifier "IntranetPortal" `
  -Identifier "https://portal.company.ru" `
  -RedirectUri "https://portal.company.ru/auth/callback" `
  -GenerateClientSecret

# Регистрация Web API (ресурс)
Add-AdfsWebApiApplication `
  -Name "Portal API" `
  -ApplicationGroupIdentifier "IntranetPortal" `
  -Identifier "https://portal.company.ru/api" `
  -AccessControlPolicyName "Permit everyone"

# Правила claim для API
Set-AdfsWebApiApplication `
  -TargetIdentifier "https://portal.company.ru/api" `
  -IssuanceTransformRules '@RuleName = "Send UPN"
c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"]
=> issue(claim = c);'

Endpoint-ы для OIDC-интеграции:

# OpenID Configuration (discovery endpoint)
# https://adfs.company.ru/adfs/.well-known/openid-configuration

# Authorize endpoint:
# https://adfs.company.ru/adfs/oauth2/authorize

# Token endpoint:
# https://adfs.company.ru/adfs/oauth2/token

# UserInfo endpoint:
# https://adfs.company.ru/adfs/userinfo

Кастомизация страницы входа

Страницу входа AD FS можно оформить в корпоративном стиле — логотип, цвета, текст. Делается так:

# Установка логотипа и иллюстрации
Set-AdfsWebTheme -TargetName default `
  -Logo @{path="C:\branding\logo.png"} `
  -Illustration @{path="C:\branding\illustration.jpg"}

# Изменение текстов
Set-AdfsGlobalWebContent `
  -SignInPageDescriptionText "Вход в корпоративную систему компании" `
  -HomeRealmDiscoveryOtherOrganizationDescriptionText "Выберите организацию" `
  -ErrorPageGenericErrorMessage "Ошибка аутентификации. Обратитесь в ИТ-отдел."

# Кастомный CSS
Set-AdfsWebTheme -TargetName default `
  -StyleSheet @{path="C:\branding\custom.css"}

# Пример custom.css:
# #loginArea { background-color: #1a365d; border-radius: 8px; }
# #submitButton { background-color: #2d6bc4; }
# .title { font-family: 'Segoe UI', sans-serif; color: #fff; }

# Для полного контроля — создание кастомной темы:
New-AdfsWebTheme -Name "CompanyTheme" -SourceName default
Export-AdfsWebTheme -Name "CompanyTheme" -DirectoryPath C:\adfs-theme
# Отредактируйте файлы в C:\adfs-theme, затем:
Set-AdfsWebTheme -TargetName "CompanyTheme" -AdditionalFileResource @{Uri="/adfs/portal/custom.js";Path="C:\adfs-theme\custom.js"}
Set-AdfsWebConfig -ActiveThemeName "CompanyTheme"

Мониторинг и troubleshooting AD FS

Диагностика SSO — куда без неё. Вот инструменты, которыми мы пользуемся в первую очередь:

# Включение расширенного аудита
Set-AdfsProperties -AuditLevel Verbose
auditpol /set /subcategory:"Application Generated" /failure:enable /success:enable

# Просмотр логов
Get-WinEvent -LogName "AD FS/Admin" -MaxEvents 20 | Format-Table TimeCreated, Message -Wrap

# Тест федерации
# PowerShell: проверка SAML-токена
$endpoint = "https://adfs.company.ru/adfs/services/trust/13/usernamemixed"
$body = @"
<s:Envelope xmlns:s='http://www.w3.org/2003/05/soap-envelope'
  xmlns:a='http://www.w3.org/2005/08/addressing'
  xmlns:u='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'>
  <s:Body>
    <trust:RequestSecurityToken xmlns:trust='http://docs.oasis-open.org/ws-sx/ws-trust/200512'>
      <wsp:AppliesTo xmlns:wsp='http://schemas.xmlsoap.org/ws/2004/09/policy'>
        <a:EndpointReference><a:Address>urn:federation:MicrosoftOnline</a:Address></a:EndpointReference>
      </wsp:AppliesTo>
      <trust:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</trust:KeyType>
      <trust:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</trust:RequestType>
    </trust:RequestSecurityToken>
  </s:Body>
</s:Envelope>
"@

Invoke-WebRequest -Uri $endpoint -Method POST -Body $body -ContentType "application/soap+xml"

# Проверка сертификатов (истечение — частая причина сбоев)
Get-AdfsCertificate | Select-Object CertificateType, Thumbprint, NotAfter | Format-Table

Типичные проблемы SSO и решения

За годы эксплуатации AD FS одни и те же грабли встречаются снова и снова. Вот самые типичные:

  • Ошибка «There was a problem accessing the site» — первым делом смотрите на SSL-сертификат: не истёк ли. Дальше — DNS-резолвинг и порт 443 на firewall
  • Бесконечный цикл редиректов — почти всегда это несовпадение Identifier (Entity ID) в настройках AD FS и на стороне приложения. Сверяйте URL посимвольно, включая слеш в конце
  • Claims не приходят в приложение — открывайте Relying Party Trust → Edit Claim Issuance Policy и проверяйте правила трансформации. Заодно убедитесь, что нужные атрибуты вообще заполнены в AD
  • Истечение Token-Signing сертификата — AD FS ротирует самоподписанные сертификаты автоматически, но приложения об этом не знают и перестают принимать токены. После ротации обновляйте метаданные на стороне приложений. Форсировать обновление можно командой Update-AdfsCertificate -Urgent
# Проверка метаданных (должны быть доступны без аутентификации)
Invoke-WebRequest -Uri "https://adfs.company.ru/FederationMetadata/2007-06/FederationMetadata.xml" | Select-Object StatusCode
# StatusCode: 200

# Обновление сертификатов
Update-AdfsCertificate -CertificateType Token-Signing
Update-AdfsCertificate -CertificateType Token-Decrypting

# Принудительная синхронизация в ферме AD FS
Set-AdfsSyncProperties -PrimaryComputerName "adfs-primary.company.local" -Role SecondaryComputer

Часто задаваемые вопросы

Клиенты часто спрашивают: чем AD FS отличается от Azure AD? Коротко: AD FS — это on-premise, стоит у вас на сервере, аутентифицирует через локальный Active Directory, данные не выходят за периметр. Azure AD (Entra ID) — облачный IdP от Microsoft. В гибридных средах они живут вместе: Azure AD Connect синхронизирует пользователей из локального AD в облако, а AD FS берёт на себя федеративную аутентификацию. Если честно, последние пару лет Microsoft активно толкает в сторону Azure AD с Password Hash Sync или Pass-through Authentication — и многие переходят. Но AD FS никуда не делся: там, где есть жёсткие требования по безопасности и данные не должны покидать периметр, он по-прежнему незаменим.

Вовсе нет. У Microsoft три варианта аутентификации для Office 365: 1) Password Hash Sync — хэши паролей уходят в Azure AD, проще не придумаешь; 2) Pass-through Authentication — аутентификация через on-premise агент, пароли никуда не синхронизируются; 3) AD FS Federation — полноценная федерация. AD FS реально нужен только когда есть конкретные требования: smart card или certificate-based аутентификация, нетривиальные MFA-сценарии, или compliance запрещает паролям покидать периметр.

Продуктивная ферма AD FS — это минимум 2 сервера за NLB (Network Load Balancer) или аппаратным балансировщиком: F5, HAProxy — без разницы. Про WID (Windows Internal Database) для хранения конфигурации сразу забудьте: потолок — 5 серверов и только master-slave репликация. Берите SQL Server Always On — один раз настроите и не будете потом переделывать. С WAP та же история: 2 сервера за внешним балансировщиком, не меньше.

Let's Encrypt с AD FS работает нормально. Но 90-дней — и сертификат протух, так что без автоматизации никуда. Мы используем win-acme (ACME-клиент для Windows) с post-renewal скриптом: Set-AdfsSslCertificate -Thumbprint NEW_THUMBPRINT и следом Set-AdfsCertificate -CertificateType Service-Communications -Thumbprint NEW_THUMBPRINT. WAP обновляется аналогично — всё это прекрасно скриптуется и запускается по расписанию.

AD FS умеет в MFA как через встроенные провайдеры, так и через внешние. Из коробки — Azure MFA (нужна лицензия Azure AD Premium) и Certificate Authentication. Сторонние: Duo Security, RSA SecurID, YubiKey через плагины. Подключается одной командой: Set-AdfsGlobalAuthenticationPolicy -AdditionalAuthenticationProvider DuoMfaAdapter. Самый частый запрос от клиентов — MFA только для внешних подключений, без лишних трений для офисных пользователей. Это решается правилом: Set-AdfsRelyingPartyTrust -TargetName "App" -AdditionalAuthenticationRules 'c:[Type == "http://schemas.microsoft.com/ws/2012/01/insidecorporatenetwork", Value == "false"] => issue(Type = "http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod", Value = "http://schemas.microsoft.com/claims/multipleauthn");' — снаружи MFA, изнутри сети прозрачно.

Нужна помощь с настройкой?

Если не хочется разбираться во всём этом самостоятельно — команда АйТи Фреш внедрит и настроит AD FS под ваши задачи. Больше 15 лет в теме, обслуживание от 15 000 ₽/мес.

📞 Связаться с нами
#AD FS настройка#Single Sign-On#SSO Windows Server#ADFS федерация#SAML аутентификация#AD FS Office 365#Windows SSO#OAuth AD FS
Комментарии 0

Оставить комментарий

загрузка...

Подпишитесь на рассылку ITfresh

Каждую неделю мы выпускаем практические гайды для руководителей IT и системных администраторов. Это не просто теория! Здесь вы найдёте всё: безопасность, 1С, миграции, резервные копии и проверенные лайфхаки из наших реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.