使用 AD FS 将 Microsoft Entra 多重身份验证配置为身份验证提供程序
本文中的信息适用于 Windows 2016 及更高版本。
如果组织与 Microsoft Entra ID 联合,你可以使用 Microsoft Entra 多重身份验证保护 Active Directory 联合身份验证服务 (AD FS) 资源(包括本地和云中的资源)。 通过 Microsoft Entra 多重身份验证,你无需使用密码,并且可以使用更安全的方式进行身份验证。 可以使用 AD FS 将 Microsoft Entra 多重身份验证配置为主要身份验证配置,或将其用作额外的身份验证提供程序。
与 Windows Server 2012 R2 中的 AD FS 不同,AD FS 2016 Microsoft Entra 多重身份验证适配器直接与 Microsoft Entra ID 集成,无需本地 Azure 多重身份验证服务器。 Microsoft Entra 多重身份验证适配器内置于 Windows Server 2016。 无需其他安装。
使用 AD FS 注册 Microsoft Entra 多重身份验证的用户
AD FS 不支持内联“证明”(注册 Microsoft Entra 多重身份验证安全验证信息,例如电话号码或移动应用)。 如果不支持内联证明,在使用 Microsoft Entra 多重身份验证对 AD FS 应用程序进行身份验证之前,用户必须先访问 https://account.activedirectory.windowsazure.com/Proofup.aspx 进行证明。 当尚未在 Microsoft Entra ID 中进行证明的用户尝试在 AD FS 中使用 Microsoft Entra 多重身份验证进行身份验证时,他们将收到 AD FS 错误。 作为 AD FS 管理员,你可以自定义此错误体验,以引导用户转到证明页面。 可以使用 onload.js 自定义来创建此消息,以检测 AD FS 页中的错误消息字符串。 然后,可以显示新消息以将用户定向到 https://aka.ms/mfasetup,以便他们能够重新尝试身份验证。 有关详细信息,请参阅自定义 AD FS 网页以引导用户注册 MFA 验证方法。
注意
在此更新之前,用户必须通过访问 https://account.activedirectory.windowsazure.com/Proofup.aspx 使用 Microsoft Entra 多重身份验证进行身份验证才能注册。 通过此更新,尚未注册 Microsoft Entra 多重身份验证信息的 AD FS 用户可以使用快捷方式 https://aka.ms/mfasetup 仅通过主要身份验证(如 Windows 集成身份验证或 AD FS 网页的用户名和密码)访问 Azure 证明页面。 如果用户未配置验证方法,则 Microsoft Entra ID 将执行内联注册。 用户会看到消息“管理员要求你设置此帐户以进行其他安全验证”。然后,用户选择“立即设置”。已配置至少一种验证方法的用户在访问证明页面时,系统仍会提示用户提供多重身份验证 (MFA)。
建议的部署拓扑
本部分介绍如何使用 Microsoft Entra 多重身份验证作为 AD FS 的主要身份验证方法以及适用于 Office 365 的 Microsoft Entra 多重身份验证。
Microsoft Entra 多重身份验证作为主要身份验证
使用 Microsoft Entra 多重身份验证作为 AD FS 的主要身份验证有几个重要原因:
- 它避免了在登录 Microsoft Entra ID、Office 365 和其他 AD FS 应用程序时输入密码。
- 它通过在输入密码之前要求其他因素(如验证码)来保护基于密码的登录。
你可能还希望使用 Microsoft Entra 多重身份验证作为主要身份验证方法和 Microsoft Entra 条件访问,包括通过提示用户提供额外因素来进行真正的 MFA。 若要在本地使用 Microsoft Entra 多重身份验证,可以通过将 SupportsMfa
设置为 $true
来配置 Microsoft Entra 域设置。 在这种配置中,Microsoft Entra ID 可以提示 AD FS 为需要它的条件访问方案执行额外的身份验证或“真正的 MFA”。
系统应提示任何未注册(尚未配置 MFA 验证信息)的 AD FS 用户配置验证信息。 若要提示未注册的用户,可以使用自定义的 AD FS 错误页将用户定向到 https://aka.ms/mfasetup 并配置验证信息。 配置后,用户可以重新尝试其 AD FS 登录。
Microsoft Entra 多重身份验证作为主要身份验证被视为单一因素。 在初始配置后,用户需要提供其他因素来管理或更新 Microsoft Entra ID 中的验证信息,或访问需要 MFA 的其他资源。
注意
使用 AD FS 2019,你需要修改 Active Directory 声明提供方信任的定位点声明类型,并将其从 windowsaccountname
修改为用户主体名称 (UPN)。 运行以下 Azure PowerShell cmdlet。 这不会影响 AD FS 场的内部功能。 进行此更改后,系统可能会再次提示一些用户输入凭据。 再次登录后,最终用户将不会看到任何差异。
Set-AdfsClaimsProviderTrust -AnchorClaimType "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn" -TargetName "Active Directory"
Microsoft Entra 多重身份验证作为 Office 365 的额外身份验证
用于 AD FS 的 Microsoft Entra 多重身份验证适配器让用户能够在 AD FS 上执行 MFA。 若要保护 Microsoft Entra 资源,应该通过条件访问策略要求 MFA。 还必须将域设置 SupportsMfa
设置为 $true
,并在用户成功执行双重验证时发出多重身份验证声明。
如前所述。系统应提示任何未注册(尚未配置 MFA 验证信息)的 AD FS 用户配置验证信息。 若要提示未注册的用户,可以使用自定义的 AD FS 错误页将用户定向到 https://aka.ms/mfasetup 并配置验证信息。 配置后,用户可以重新尝试其 AD FS 登录。
先决条件
使用 Microsoft Entra 多重身份验证通过 AD FS 进行身份验证时,需要满足以下先决条件:
注意
Microsoft Entra ID 和 Microsoft Entra 多重身份验证包含在 Microsoft Entra ID P1 或 P2 以及企业移动性套件 (EMS) 中。 如果安装了其中任一应用程序,则不需要单独的订阅。
- Windows Server 2016 AD FS 本地环境。
- 服务器需要能够通过端口 443 与以下 URL 通信。
https://adnotifications.windowsazure.com
https://login.microsoftonline.com
- 服务器需要能够通过端口 443 与以下 URL 通信。
- 你的本地环境必须与 Microsoft Entra ID 联合。
- 用于 Windows PowerShell 的 Microsoft Azure Active Directory 模块。
- 对 Microsoft Entra ID 实例具有全局管理员权限,以使用 Azure AD PowerShell 对其进行配置。
- 有权为 Microsoft Entra 多重身份验证配置 AD FS 场的企业管理员凭据。
注意
自 2024 年 3 月 30 日起,Azure AD 和 MSOnline PowerShell 模块已弃用。 若要了解详细信息,请阅读有关弃用的更新。 在此日期之后,对这些模块的支持仅限于到 Microsoft Graph PowerShell SDK 的迁移帮助和安全性修复。 弃用的模块将持续运行至 2025 年 3 月 30 日。
我们建议迁移到 Microsoft Graph PowerShell,以便与 Microsoft Entra ID(以前称为 Azure AD)进行交互。 有关常见迁移问题,请参阅迁移常见问题解答。 注意:2024 年 6 月 30 日之后,MSOnline 版本 1.0.x 可能会遇到中断。
配置 AD FS 服务器
若要完成用于 AD FS 的 Microsoft Entra 多重身份验证配置,需要使用此处所述步骤配置每个 AD FS 服务器。
注意
确保在场中的所有 AD FS 服务器上执行这些步骤。 如果场中有多台 AD FS 服务器,则可以使用 Azure AD PowerShell 远程执行必要的配置。
步骤 1:在每个 AD FS 服务器上为 Microsoft Entra 多重身份验证生成证书
你需要做的第一件事是使用 New-AdfsAzureMfaTenantCertificate
PowerShell 命令生成一个证书,供 Microsoft Entra 多重身份验证使用。 生成证书后,在本地计算机证书存储中找到它。 证书标有使用者名称,其中包含 Microsoft Entra 目录的 TenantID。
TenantID 是 Microsoft Entra ID 目录的名称。 使用以下 PowerShell cmdlet 生成新证书:
$certbase64 = New-AdfsAzureMfaTenantCertificate -TenantID <tenantID>
步骤 2:将新凭据添加到 Azure 多重身份验证客户端服务主体
为了使 AD FS 服务器能够与 Azure 多重身份验证客户端通信,需要将凭据添加到 Azure 多重身份验证客户端的服务主体。 使用 New-AdfsAzureMFaTenantCertificate cmdlet 生成的证书将充当这些凭据。 打开 PowerShell 并执行以下操作,从而将新凭据添加到 Azure 多重身份验证客户端服务主体。
步骤 3:将证书设置为针对 Azure 多重身份验证客户端的新凭据
注意
若要完成此步骤,需使用 Connect-MgGraph
连接到带 Microsoft Graph PowerShell 的 Microsoft Entra ID 实例。 这些步骤假定你已经通过 PowerShell 建立连接。
Connect-MgGraph -Scopes 'Application.ReadWrite.All'
$servicePrincipalId = (Get-MgServicePrincipal -Filter "appid eq '981f26a1-7f43-403b-a875-f8b09b8cd720'").Id
$keyCredentials = (Get-MgServicePrincipal -Filter "appid eq '981f26a1-7f43-403b-a875-f8b09b8cd720'").KeyCredentials
$certX509 = [System.Security.Cryptography.X509Certificates.X509Certificate2]([System.Convert]::FromBase64String($certBase64))
$newKey = @(@{
CustomKeyIdentifier = $null
DisplayName = $certX509.Subject
EndDateTime = $null
Key = $certX509.GetRawCertData()
KeyId = [guid]::NewGuid()
StartDateTime = $null
Type = "AsymmetricX509Cert"
Usage = "Verify"
AdditionalProperties = $null
})
$keyCredentials += $newKey
Update-MgServicePrincipal -ServicePrincipalId $servicePrincipalId -KeyCredentials $keyCredentials
重要
需要在场中的所有 AD FS 服务器上运行此命令。 在尚未将证书设置为针对 Azure 多重身份验证客户端的新凭据的服务器上,Microsoft Entra 多重身份验证将失败。
注意
对于 Azure 多重身份验证客户端,GUID 为 981f26a1-7f43-403b-a875-f8b09b8cd720。
配置 AD FS 场
在每台 AD FS 服务器上完成上一部分中的步骤后,使用 Set-AdfsAzureMfaTenant cmdlet 设置 Azure 租户信息。 对于 AD FS 场,此 cmdlet 只需执行一次。
打开 PowerShell,并使用 Set-AdfsAzureMfaTenant
cmdlet 输入自己的 tenantId。 对于使用 Microsoft Azure 政府云的客户,请添加 -Environment USGov
参数:
注意
需要在场中的每台服务器上重新启动 AD FS 服务以使这些更改生效。 为了最大限度地减少影响,请从 NLB 轮换中逐个移除 AD FS 服务器,然后等待所有连接排出。
Set-AdfsAzureMfaTenant -TenantId <tenant ID> -ClientId 981f26a1-7f43-403b-a875-f8b09b8cd720
没有最新服务包的 Windows Server 不支持 Set-AdfsAzureMfaTenant
的 -Environment
参数。 如果使用 Azure 政府云,并且前面的步骤由于缺少 -Environment
参数而无法配置 Azure 租户,请完成以下步骤以手动创建注册表项。 如果以前的 cmdlet 正确注册了你的租户信息,或者如果你不在 Azure 政府云中,请跳过这些步骤:
打开 AD FS 服务器上的注册表编辑器。
导航至 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ADFS。 创建以下注册表项值:
注册表项 值 SasUrl https://adnotifications.windowsazure.us/StrongAuthenticationService.svc/Connector
StsUrl https://login.microsoftonline.us
ResourceUri https://adnotifications.windowsazure.us/StrongAuthenticationService.svc/Connector
请在场中的每台服务器上重新启动 AD FS 服务以使这些更改生效。 为了减少对系统的影响,请从 NLB 轮换中逐个移除 AD FS 服务器,然后等待所有连接排出。
在此步骤之后,你将看到 Microsoft Entra 多重身份验证可作为 Intranet 和 Extranet 使用的主要身份验证方法。
如果要将 Microsoft Entra 多重身份验证用作辅助身份验证方法,请在“编辑身份验证方法”框中选择“多重”选项卡(在 AD FS 2019 中为“其他”选项卡)并确保启用它。 否则,你可能会收到错误消息,例如“找不到有效的强身份验证方法。 请与管理员联系以配置并启用相应的强身份验证提供程序。
续订和管理 AD FS Microsoft Entra 多重身份验证证书
以下指导旨在帮助管理 AD FS 服务器上的 Microsoft Entra 多重身份验证证书。
默认情况下,使用 Microsoft Entra 多重身份验证配置 AD FS 时,通过 New-AdfsAzureMfaTenantCertificate
PowerShell cmdlet 生成的证书的有效期为两年。 若要确定证书的到期时间,以及续订并安装新证书,请使用以下过程。
评估 AD FS Microsoft Entra 多重身份验证证书到期日期。
在每个 AD FS 服务器上的本地计算机“我的存储”中,“颁发者和使用者”区域中将有一个自签名证书,其中包含“Microsoft AD FS Microsoft Entra 多重身份验证”。 此证书是 Microsoft Entra 多重身份验证证书。 检查每个 AD FS 服务器上此证书的有效期,以确定到期日期。
在每个 AD FS 服务器上创建新的 AD FS Microsoft Entra 多重身份验证证书。
如果证书的有效期即将结束,请通过在每个 AD FS 服务器上生成新的 Microsoft Entra 多重身份验证证书来启动续订过程。 在 PowerShell 中,使用以下 cmdlet 在每个 AD FS 服务器上生成新证书:
注意
如果证书已过期,请不要将
-Renew $true
参数添加到以下命令中。 在这种情况下,现有的过期证书将被新证书替换,而不是保留在原来的位置并创建额外的证书。$newcert = New-AdfsAzureMfaTenantCertificate -TenantId <tenant id such as contoso.onmicrosoft.com> -Renew $true
如果证书尚未过期,则该命令将生成一个新证书,该证书的有效期为当前日期后的两天到未来两年加上两天。 运行 cmdlet 或续订证书时,AD FS 和 Microsoft Entra 多重身份验证操作不受影响。 有意设计 2 天的延迟,留出时间执行以下步骤,以便在 AD FS 开始将新证书用于 Microsoft Entra 多重身份验证之前在租户中配置新证书。
在 Microsoft Entra 租户中配置每个新的 AD FS Microsoft Entra 多重身份验证证书。
注意
若要完成此步骤,需使用
Connect-MgGraph
连接到带 Microsoft Graph PowerShell 的 Microsoft Entra ID 实例。 这些步骤假定你已经通过 PowerShell 建立连接。Connect-MgGraph -Scopes 'Application.ReadWrite.All' $servicePrincipalId = (Get-MgServicePrincipal -Filter "appid eq '981f26a1-7f43-403b-a875-f8b09b8cd720'").Id $keyCredentials = (Get-MgServicePrincipal -Filter "appid eq '981f26a1-7f43-403b-a875-f8b09b8cd720'").KeyCredentials $certX509 = [System.Security.Cryptography.X509Certificates.X509Certificate2]([System.Convert]::FromBase64String($newcert)) $newKey = @(@{ CustomKeyIdentifier = $null DisplayName = $certX509.Subject EndDateTime = $null Key = $certX509.GetRawCertData() KeyId = [guid]::NewGuid() StartDateTime = $null Type = "AsymmetricX509Cert" Usage = "Verify" AdditionalProperties = $null }) $keyCredentials += $newKey Update-MgServicePrincipal -ServicePrincipalId $servicePrincipalId -KeyCredentials $keyCredentials
如果以前的证书过期,请重新启动 AD FS 服务以获取新证书。 如果在证书过期之前续订了证书,则不需要重新启动 AD FS 服务。
验证新证书是否用于 Microsoft Entra 多重身份验证。
新证书生效后,AD FS 将在几个小时到一天内获取它们并使用 Microsoft Entra 多重身份验证的每个相应证书。 AD FS 使用新证书后,在每台服务器上,你将看到 AD FS 管理事件日志中记录了一个事件,其中包含以下信息:
Log Name: AD FS/Admin
Source: AD FS
Date: 2/27/2018 7:33:31 PM
Event ID: 547
Task Category: None
Level: Information
Keywords: AD FS
User: DOMAIN\adfssvc
Computer: ADFS.domain.contoso.com
Description:
The tenant certificate for Azure MFA has been renewed.
TenantId: contoso.onmicrosoft.com.
Old thumbprint: 7CC103D60967318A11D8C51C289EF85214D9FC63.
Old expiration date: 9/15/2019 9:43:17 PM.
New thumbprint: 8110D7415744C9D4D5A4A6309499F7B48B5F3CCF.
New expiration date: 2/27/2020 2:16:07 AM.
自定义 AD FS 网页以引导用户注册 MFA 验证方法
使用以下示例为尚未证明(已配置 MFA 验证信息)的用户自定义 AD FS 网页。
查找错误
首先,当用户缺少验证信息时,AD FS 会返回几个不同的错误消息。 如果使用 Microsoft Entra 多重身份验证作为主要身份验证,则未经证明的用户会看到包含以下消息的 AD FS 错误页:
<div id="errorArea">
<div id="openingMessage" class="groupMargin bigText">
An error occurred
</div>
<div id="errorMessage" class="groupMargin">
Authentication attempt failed. Select a different sign in option or close the web browser and sign in again. Contact your administrator for more information.
</div>
尝试将 Microsoft Entra ID 作为额外身份验证时,未经证明的用户会看到包含以下消息的 AD FS 错误页:
<div id='mfaGreetingDescription' class='groupMargin'>For security reasons, we require additional information to verify your account (mahesh@jenfield.net)</div>
<div id="errorArea">
<div id="openingMessage" class="groupMargin bigText">
An error occurred
</div>
<div id="errorMessage" class="groupMargin">
The selected authentication method is not available for 'username@contoso.com'. Choose another authentication method or contact your system administrator for details.
</div>
捕获错误并更新页面文本
要捕获错误并显示用户自定义指南,请将 JavaScript 附加到 onload.js
文件的末尾(此文件是 AD FS Web 主题的一部分)。 这样做使你可以:
- 搜索标识错误字符串。
- 提供自定义 Web 内容。
注意
有关如何自定义 onload.js 文件的一般指导,请参阅 AD FS 登录页的高级自定义。
以下步骤演示了一个简单的示例:
在主 AD FS 服务器上打开 Windows PowerShell,并通过运行以下命令创建新的 AD FS Web 主题。
New-AdfsWebTheme –Name ProofUp –SourceName default
创建文件夹并导出默认的 AD FS Web 主题。
New-Item -Path 'C:\Theme' -ItemType Directory;Export-AdfsWebTheme –Name default –DirectoryPath C:\Theme
在文本编辑器中打开 C:\Theme\script\onload.js 文件。
将以下代码附加到 onload.js 文件的末尾:
//Custom Code //Customize MFA exception //Begin var domain_hint = "<YOUR_DOMAIN_NAME_HERE>"; var mfaSecondFactorErr = "The selected authentication method is not available for"; var mfaProofupMessage = "You will be automatically redirected in 5 seconds to set up your account for additional security verification. After you've completed the setup, please return to the application you are attempting to access.<br><br>If you are not redirected automatically, please click <a href='{0}'>here</a>." var authArea = document.getElementById("authArea"); if (authArea) { var errorMessage = document.getElementById("errorMessage"); if (errorMessage) { if (errorMessage.innerHTML.indexOf(mfaSecondFactorErr) >= 0) { //Hide the error message var openingMessage = document.getElementById("openingMessage"); if (openingMessage) { openingMessage.style.display = 'none' } var errorDetailsLink = document.getElementById("errorDetailsLink"); if (errorDetailsLink) { errorDetailsLink.style.display = 'none' } //Provide a message and redirect to Azure AD MFA Registration Url var mfaRegisterUrl = "https://account.activedirectory.windowsazure.com/proofup.aspx?proofup=1&whr=" + domain_hint; errorMessage.innerHTML = "<br>" + mfaProofupMessage.replace("{0}", mfaRegisterUrl); window.setTimeout(function () { window.location.href = mfaRegisterUrl; }, 5000); } } } //End Customize MFA Exception //End Custom Code
重要
你需要在此处更改“<YOUR_DOMAIN_NAME_HERE>”,更改为使用你的域名。 例如:
var domain_hint = "contoso.com";
。保存 onload.js 文件。
通过输入以下 Windows PowerShell 命令,将 onload.js 文件导入到自定义主题中:
Set-AdfsWebTheme -TargetName ProofUp -AdditionalFileResource @{Uri='/adfs/portal/script/onload.js';path="c:\theme\script\onload.js"}
通过输入以下 Windows PowerShell 命令应用自定义 AD FS Web 主题:
Set-AdfsWebConfig -ActiveThemeName "ProofUp"