使用 AD FS 将 Azure MFA 配置为身份验证提供程序
如果你的组织与 Azure AD 联合,你可以使用 Azure 多重身份验证保护 AD FS 资源(包括本地和云中的资源)。 使用 Azure MFA 可以消除密码并提供更安全的方式来进行身份验证。 从Windows Server 2016开始,现在可以为主要身份验证配置 Azure MFA,或者将其用作其他身份验证提供程序。
与 Windows Server 2012 R2 中的 AD FS 不同,AD FS 2016 Azure MFA 适配器直接与 Azure AD 集成,不需要本地 Azure MFA 服务器。 Azure MFA 适配器内置于Windows Server 2016,无需进行其他安装。
使用 AD FS 注册 Azure MFA 的用户
AD FS 不支持内联“证明”或注册 Azure MFA 安全验证信息,例如电话号码或移动应用。 这意味着用户必须先访问 https://account.activedirectory.windowsazure.com/Proofup.aspx Azure MFA 才能向 AD FS 应用程序进行身份验证来证明用户。 如果用户尚未在Azure AD尝试在 AD FS 中使用 Azure MFA 进行身份验证,他们将收到 AD FS 错误。 作为 AD FS 管理员,可以自定义此错误体验,以引导用户改用校对页。 可以使用onload.js自定义来检测 AD FS 页中的错误消息字符串,并显示一条新消息,引导用户访问 https://aka.ms/mfasetup,然后重新尝试身份验证。 有关详细指南,请参阅本文下面的“自定义 AD FS 网页以指导用户注册 MFA 验证方法”。
注意
以前,用户需要通过 MFA 进行身份验证才能进行注册 (访问 https://account.activedirectory.windowsazure.com/Proofup.aspx,例如通过快捷方式 https://aka.ms/mfasetup) 。 现在,尚未注册 MFA 验证信息的 AD FS 用户可以通过仅使用主身份验证 ((例如通过 AD FS 网页Windows集成身份验证或用户名和密码)) 的快捷方式https://aka.ms/mfasetup访问Azure AD的校对页。 如果用户未配置验证方法,Azure AD将执行内联注册,用户会看到“管理员要求你为此帐户设置其他安全验证”的消息,然后用户可以选择“立即设置它”。 访问校对页面时,仍会提示已配置至少一个 MFA 验证方法的用户提供 MFA。
建议的部署拓扑
Azure MFA 作为主要身份验证
将 Azure MFA 用作 AD FS 的主要身份验证有以下几个重要原因:
- 为了避免登录Azure AD、Office 365和其他 AD FS 应用的密码
- 若要通过要求密码之前的验证码等附加因素来保护基于密码的登录
如果要在 AD FS 中使用 Azure MFA 作为主要身份验证方法来实现这些优势,可能还希望通过提示 AD FS 中的其他因素来继续使用Azure AD条件访问,包括“真正的 MFA”。
现在,可以通过将Azure AD域设置配置为在本地执行 MFA, (将“SupportsMfa”设置为$True) 来执行此操作。 在此配置中,AZURE AD可以提示 AD FS 对需要它的条件访问方案执行其他身份验证或“true MFA”。
如上所述,尚未注册 (配置 MFA 验证信息) 的任何 AD FS 用户都应通过自定义 AD FS 错误页提示你访问 https://aka.ms/mfasetup 以配置验证信息,然后重新尝试 AD FS 登录。 由于 Azure MFA 作为主要因素被视为单个因素,因此在初始配置用户需要提供一个附加因素来管理或更新Azure AD中的验证信息,或者访问需要 MFA 的其他资源。
注意
使用 AD FS 2019 时,需要修改 Active Directory 声明提供程序信任的定位点声明类型,并将其从 windowsaccountname 修改为 UPN。 执行下面提供的 PowerShell cmdlet。 这不会影响 AD FS 场的内部功能。 你可能会注意到一些用户在进行此更改后可能会重新提示输入凭据。 再次登录后,最终用户将看不到任何差异。
Set-AdfsClaimsProviderTrust -AnchorClaimType "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn" -TargetName "Active Directory"
将 Azure MFA 作为用于Office 365的其他身份验证
适用于 AD FS 的 Azure MFA 适配器使用户能够在 AD FS 上执行 MFA。 若要保护 Azure AD 资源,建议通过条件访问策略来要求进行 MFA,将域设置“SupportsMfa”设置为“$True”,并在用户成功执行双重验证时发出多重身份验证声明。
如上所述,尚未注册 (配置 MFA 验证信息) 的任何 AD FS 用户都应通过自定义 AD FS 错误页提示你访问 https://aka.ms/mfasetup 以配置验证信息,然后重新尝试 AD FS 登录。
先决条件
使用 Azure MFA 进行 AD FS 身份验证时,需要满足以下先决条件:
注意
Azure AD和 Azure MFA 包含在 Azure AD Premium 和 Enterprise Mobility Suite (EMS) 中。 如果你有其中任一订阅,则不需要单个订阅。
- Windows Server 2016 AD FS 本地环境。
- 服务器需要能够通过端口 443 与以下 URL 通信。
- 本地环境与Azure AD联合。
- 用于Windows PowerShell的 Windows Azure Active Directory 模块。
- 全局管理员Azure AD实例的权限,以使用 Azure AD PowerShell 对其进行配置。
- Enterprise管理员凭据来配置 Azure MFA 的 AD FS 场。
配置 AD FS 服务器
若要完成 AZURE MFA for AD FS 的配置,需要使用所述的步骤配置每个 AD FS 服务器。
注意
确保这些步骤在场 中的所有 AD FS 服务器上执行。 如果场中有多个 AD FS 服务器,则可以使用 Azure AD PowerShell 远程执行必要的配置。
步骤 1:使用 New-AdfsAzureMfaTenantCertificate cmdlet 为每个 AD FS 服务器上生成 Azure MFA 的证书
首先需要做的是生成证书供 Azure MFA 使用。 可以使用 PowerShell 完成此操作。 生成的证书可以在本地计算机证书存储中找到,并且它用包含Azure AD目录的 TenantID 的使用者名称进行标记。

请注意,TenantID 是Azure AD中目录的名称。 使用以下 PowerShell cmdlet 生成新证书。
$certbase64 = New-AdfsAzureMfaTenantCertificate -TenantID <tenantID>

步骤 2:将新凭据添加到 Azure 多重身份验证客户端服务主体
若要使 AD FS 服务器能够与 Azure 多重身份验证客户端通信,需要将凭据添加到 Azure 多重身份验证客户端的服务主体。 使用 New-AdfsAzureMFaTenantCertificate cmdlet 生成的证书将充当这些凭据。 使用以下 PowerShell 将新凭据添加到 Azure 多重身份验证客户端服务主体。
注意
若要完成此步骤,需要使用 PowerShell Connect-MsolService连接到Azure AD实例。 这些步骤假定你已通过 PowerShell 连接。 有关信息,请参阅 Connect-MsolService。
将证书设置为针对 Azure 多重身份验证客户端的新凭据
New-MsolServicePrincipalCredential -AppPrincipalId 981f26a1-7f43-403b-a875-f8b09b8cd720 -Type asymmetric -Usage verify -Value $certBase64
重要
此命令需要在场中的所有 AD FS 服务器上运行。 Azure AD MFA 将在未将证书设置为针对 Azure 多重身份验证客户端的新凭据的服务器上失败。
注意
981f26a1-7f43-403b-a875-f8b09b8cd720 是 Azure 多重身份验证客户端的 GUID。
配置 AD FS 场
完成每个 AD FS 服务器上的上一部分后,使用 Set-AdfsAzureMfaTenant cmdlet 设置 Azure 租户信息。 对于 AD FS 场,只需执行一次此 cmdlet。
打开 PowerShell 提示符,并使用 Set-AdfsAzureMfaTenant cmdlet 输入自己的 tenantId。 对于使用 Microsoft Azure 政府云的客户,请添加-Environment USGov参数:
注意
在这些更改生效之前,需要在场中的每个服务器上重启 AD FS 服务。 为了尽量减少影响,请让每个 AD FS 服务器一次从 NLB 轮换一台,并等待所有连接耗尽。
Set-AdfsAzureMfaTenant -TenantId <tenant ID> -ClientId 981f26a1-7f43-403b-a875-f8b09b8cd720

Windows没有最新 Service Pack 的服务器不支持 -EnvironmentSet-AdfsAzureMfaTenant cmdlet 的参数。 如果使用 Azure 政府 云,并且由于缺少-Environment参数而未能配置 Azure 租户,请完成以下步骤以手动创建注册表项。 如果前面的 cmdlet 正确注册了租户信息,或者不在 Azure 政府 云中,请跳过这些步骤:
在 AD FS 服务器上打开 注册表编辑器 。
导航到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ADFS。 创建以下注册表项值:在这些更改生效之前,请在场中的每个服务器上重启 AD FS 服务。 为了尽量减少影响,请让每个 AD FS 服务器一次一次退出 NLB 轮换,并等待所有连接耗尽。
之后,你将看到 Azure MFA 可用作 Intranet 和 Extranet 使用的主要身份验证方法。

如果要使用 Azure MFA 作为辅助身份验证方法,请在“编辑身份验证方法”框中,选择“多重”选项卡 (AD FS 2019) 中的“其他”选项卡,并确保它已启用。 否则,可能会收到错误消息,例如“找不到有效的强身份验证方法”。 请与管理员联系,配置并启用适当的强身份验证提供程序”。
续订和管理 AD FS Azure MFA 证书
以下指南介绍了如何在 AD FS 服务器上管理 Azure MFA 证书。
默认情况下,使用 Azure MFA 配置 AD FS 时,通过 New-AdfsAzureMfaTenantCertificate PowerShell cmdlet 生成的证书有效期为 2 年。 若要确定证书过期程度,然后续订并安装新证书,请使用以下过程。
评估 AD FS Azure MFA 证书到期日期
在每个 AD FS 服务器上,在本地计算机“我的存储”中,颁发者和使用者中将有一个自签名证书,其中包含“OU=Microsoft AD FS Azure MFA”。 这是 Azure MFA 证书。 检查每个 AD FS 服务器上此证书的有效期,以确定到期日期。
在每个 AD FS 服务器上创建新的 AD FS Azure MFA 证书
如果证书的有效期即将结束,请在每个 AD FS 服务器上生成新的 Azure MFA 证书来启动续订过程。 在 PowerShell 命令窗口中,使用以下 cmdlet 在每个 AD FS 服务器上生成新证书:
注意
如果证书已过期,请不要将 -Renew $true 参数添加到以下命令。 在此方案中,现有过期证书将替换为新的证书,而不是保留该证书,并创建其他证书。
PS C:\> $newcert = New-AdfsAzureMfaTenantCertificate -TenantId <tenant id such as contoso.onmicrosoft.com> -Renew $true
如果证书尚未过期,则会生成从未来 2 天到 2 天 + 2 年的新证书。 AD FS 和 Azure MFA 操作不受此 cmdlet 或新证书的影响。 (注意:有意延迟 2 天,并提供执行以下步骤,以便在 AD FS 开始将其用于 Azure MFA.) 之前在租户中配置新证书
在Azure AD租户中配置每个新的 AD FS Azure MFA 证书
使用 Azure AD PowerShell 模块,针对每个 AD FS 服务器) 上的每个新证书 (更新Azure AD租户设置,如下所示 (注意:必须先使用以下命令连接到租户Connect-MsolService,以运行以下命令) 。
PS C:/> New-MsolServicePrincipalCredential -AppPrincipalId 981f26a1-7f43-403b-a875-f8b09b8cd720 -Type Asymmetric -Usage Verify -Value $newcert
如果以前的证书已过期,请重启 AD FS 服务以选取新证书。 如果在证书过期之前续订了证书,则无需重启 AD FS 服务。
验证新证书 () 是否将用于 Azure MFA
新证书 () 生效后,AD FS 将在数小时内开始为 Azure MFA 使用每个相应证书。 发生此情况后,在每个服务器上,会看到 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 将返回几个不同的错误消息。 如果使用 Azure MFA 作为主身份验证,未经验证的用户将看到一个 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>
当尝试其他身份验证时Azure AD时,未经证明的用户将看到一个 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 追加到属于 AD FS Web 主题的onload.js文件的末尾。 用户从而可以执行以下操作:
- 搜索标识错误字符串 (s)
- 提供自定义 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. Once you have 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"