AD FS 登录页的高级自定义
Windows Server 2012 R2 及更高版本中的 Active Directory 联合身份验证服务 (AD FS) 支持自定义用户登录体验。 在大多数情况下,可以使用内置的 Windows PowerShell cmdlet 来配置 AD FS 登录页。 建议的方法是尽可能使用内置的 Windows PowerShell 命令进行自定义。 有关详细信息,请参阅 AD-FS 用户登录自定义。
有时,可能需要提供无法使用 AD FS 附带的 PowerShell 命令启用的登录体验。 可以通过将自定义代码添加到随 AD FS 提供的 onload.js 文件来配置登录体验。 文件代码在所有 AD FS 页上执行。
注意事项
在开始自定义 AD FS 登录页之前,请查看以下重要注意事项。
重要
不支持任何影响重定向流或修改 AD FS 使用的协议参数的自定义更改。
onload.js 文件在所有 AD FS 页上执行,包括基于窗体的登录页、主领域发现页等。 始终确保自定义代码仅按预期执行,而不会意外执行。
AD FS 附带称为“默认”的内置 Web 主题。 无法修改创建默认 Web 主题的 onload.js 内容。 若要更新 onload.js 文件,请创建并使用 AD FS 登录页的自定义 Web 主题。 有关详细信息,请参阅 AD-FS 用户登录自定义。
默认 Web 主题的原始 onload.js 文件还包含用于处理不同外形规格的页面呈现的代码。 建议的自定义方法是将自定义逻辑代码追加到现有的 onload.js 文件。 不要修改原始 onload.js 文件内容。
引用 HTML 元素时,请务必在对元素执行操作之前检查该元素是否存在。 这个步骤比较稳妥,可确保自定义逻辑不会在不包含此元素的页面上执行。 若要标识现有 HTML 元素,请在 AD FS 登录页上查看 HTML 源。
建议在将自定义项移动到生产 AD FS 服务器之前,在备用环境中验证自定义项并运行测试。 此步骤降低了在验证之前最终用户接触到这些自定义项的可能性。
自定义步骤
以下部分提供为 AD FS 登录页自定义 onload.js 文件内容的步骤。
创建自定义 Web 主题
若要将自定义逻辑添加到 onload.js 文件,第一步是创建自定义 Web 主题。 快速方法是导出默认 Web 主题,然后使用原始代码作为自定义的基础。
运行以下 cmdlet,通过复制默认 Web 主题创建自定义 Web 主题:
New-AdfsWebTheme –Name custom –SourceName default
生成 onload.js 文件
下一步是导出自定义 Web 主题,以便拥有可更新的 onload.js 文件。
运行以下 cmdlet 以导出自定义 Web 主题并生成 onload.js 文件:
Export-AdfsWebTheme –Name default –DirectoryPath c:\theme
onload.js 文件放置在 cmdlet 指定目录中的 script 文件夹中。 在此示例中,指定的文件夹为 c:\theme
。
添加自定义项
现在,你已准备好修改 onload.js 内容并为方案添加自定义逻辑代码。 如上所述,请务必将自定义代码添加到 onload.js 文件的末尾。
有关演示常见自定义的代码片段,请参阅以下示例部分。
更改目标 onload.js 文件
添加自定义项后,需要更新 AD FS Web 主题以使用你的 onload.js 文件而不是原始 onload.js 文件。
运行以下 cmdlet,将 onload.js 文件设置为 Web 主题定义的目标:
Windows Server 2016 和更高版本上的 AD FS:
Set-AdfsWebTheme -TargetName custom -OnLoadScriptPath "c:\theme\script\onload.js"
对于 Windows Server 2012 R2 上的 AD FS:
Set-AdfsWebTheme -TargetName custom -AdditionalFileResource @{Uri='/adfs/portal/script/onload.js';path="c:\theme\script\onload.js"}
将自定义应用于 AD FS
最后一步是将自定义项应用于 AD FS 登录页。
运行以下 cmdlet 以使用自定义项更新 AD FS:
Set-AdfsWebConfig -ActiveThemeName custom
示例
以下示例提供可添加到 onload.js 文件以配置 AD FS 登录页的自定义代码。
备注
始终将自定义代码追加到 onload.js 文件的末尾。
更改登录页标题字符串
AD FS 基于窗体的登录页在用户输入字段上方显示标题。 默认标题值为“使用组织帐户登录”。
通过将以下代码添加到 onload.js 文件,将默认字符串值替换为自定义字符串。 在代码中,将 loginMessage.innerHTML
参数的值设置为要用于标题的自定义字符串。
// Sample code to change page title string
// Check if loginMessage element is present
var loginMessage = document.getElementById('loginMessage');
if (loginMessage)
{
// If loginMessage element is present, change title to custom value
loginMessage.innerHTML = 'Custom title string value';
}
接受 SAM 帐户名称登录
默认情况下,AD FS 基于窗体的登录页支持两种登录方法:
userPrincipalName": A user principal name (UPN), such as
user@contoso.com`.samAccountName
:域限定的安全帐户管理员 (SAM) 帐户名称,例如contoso\user
或contoso.com\user
。
假设所有用户都在同一域中,并且用户只知道其 SAM 帐户名称。 可以更新登录页,以允许用户仅使用其 SAM 帐户名称登录。
通过将以下代码添加到 onload.js 文件,仅支持从 SAM 帐户登录。 在代码中,将 userNameValue
参数的值设置为所需的域。
// Sample code to enable user login from SAM account name only
if (typeof Login != 'undefined'){
Login.submitLoginRequest = function () {
var u = new InputUtil();
var e = new LoginErrors();
var userName = document.getElementById(Login.userNameInput);
var password = document.getElementById(Login.passwordInput);
// Update login method with desired domain value
if (userName.value && !userName.value.match('[@\\\\]'))
{
var userNameValue = 'contoso.com\\' + userName.value;
document.forms['loginForm'].UserName.value = userNameValue;
}
// Check for user name errors
if (!userName.value) {
u.setError(userName, e.userNameFormatError);
return false;
}
// Check for password errors
if (!password.value)
{
u.setError(password, e.passwordEmpty);
return false;
}
// Update the form page
document.forms['loginForm'].submit();
return false;
};
}