简介
本文档介绍如何改善统一联系中心企业版(UCCE)单点登录(SSO)登录中的最终用户体验。 如果用户不被强制在身份提供程序(IdP)登录页面再次输入其登录ID,则可以改进此功能。
先决条件
要求
Cisco 建议您了解以下主题:
- UCCE SSO登录流和AD FS
- 超文本传输协议(HTTP)
- 超文本标记语言(HTML)
- 安全断言标记语言2.0(SAMLv2)
- 打开授权2.0(OAuthv2)
- 熟悉Windows PowerShell(PS)
- 熟悉JavaScript(JS)
使用的组件
本文档中的信息基于以下软件和硬件版本:
- UCCE 11.5(1)及以上版本
- Finesse 11.5(1)及以上版本
- 思科统一情报中心(CUIC)11.5(1)及更高版本。
- Microsoft Active Directory(AD) — 安装在Windows Server上的AD
- AD FS 2.0/3.0
- Windows Server 2012 R2
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您的网络处于活动状态,请确保您了解所有命令的潜在影响。
背景信息
在UCCE SSO登录中,用户必须输入其登录ID两次:首先在UCCE应用登录页(Finesse、CUIC等)上输入,其次在IdP登录页(如果使用Forms Authentication方法)上输入。 在本文档的示例中,Active Directory联合身份验证服务(AD FS)用作IdP。
在UCCE中启用SSO时,在输入登录ID并按CUIC/Finesse上的Submit/Login按钮后,输入的登录ID将存储在cookie cc_username中,并保留以用于重定向到身份服务器(IdS),然后重定向到IdP。可以在IdP登录页上使用此cookie自动填充登录ID。
请复习,以下是HTTP/SAML流程图示例,其中最终用户是Finesse代理,UCCE应用是Finesse服务器。
这是最终用户Web浏览器向AD FS(IdP)发送的步骤4c HTTP请求报头的示例。
Request URL: https://dc01.omozol.lab/adfs/ls/?SAMLRequest=tZTBjtowEIbv%2BxSR...
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cache-Control: no-cache
Connection: keep-alive
Cookie: cc_username=agent1%40omozol.lab
Host: dc01.omozol.lab
Pragma: no-cache
Referer: https://fns01p.omozol.lab/desktop/container/landing.jsp?locale=en_US
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
配置
以AD FS 3.0作为IdP,通过修改onload.js文件(AD FS将其注入到HTML页面中以响应https://<AD FS FQDN>/adfs/ls/)返回给用户)来实现配置。
步骤1.要修改onload.js文件,请通过PowerShell cmdlet将文件导出到文件系统:
PS C:\> Export-AdfsWebTheme -Name default -DirectoryPath c:\temp\adfs\
onload.js文件被放置在此目录中:
C:\temp\adfs\script
步骤2.根据登录格式,在文件中现有代码结构/逻辑之外的任何位置添加正确的JS代码片段。为方便起见,请将其添加到文件底部。
默认情况下,Windows Server 2012 R2中AD FS向SSO用户显示的登录页需要用户名为userPrincipleName(UPN)表单。这是类似电子邮件的格式,例如user@cisco.com。在单个域联系中心中,可以修改AD FS登录页面,以允许不包含域名作为用户名一部分的简单sAMAccountNameUser ID(UID)。
如果AD FS登录页上需要输入UPN用户名,请使用以下代码段:
// Get cc_username as login ID from HTTP Cookie header
if (document.cookie) {
// If the position of cc_username in the cookie is the first position, 0...
if (document.cookie.indexOf('cc_username') == 0) {
// Split the cookie into an array with the delimitor being '='
var cookies = document.cookie.split('=');
// If the first element of the array is cc_username then...
if (cookies[0] == 'cc_username') {
// ...the second element will be the actual username and we should save that.
var cc_login_name = cookies[1];
}
// Customize Login page: add domain if needed as AD FS by default require login ID in UPN form
// If the parsed login is not null, do the following logic
if (cc_login_name != null) {
// If %40 (encoded '=') does not exist in the login name...
if (cc_login_name.indexOf('%40') == -1) {
// ...then add '@domain.com' to ensure a UPN format is input
var userNameValue = cc_login_name + '@' + 'domain.com';
// Populate the UPN into the userNameInput of the page, and put the focus
// on the password.
document.getElementById("userNameInput").value = userNameValue;
document.getElementById("passwordInput").focus();
} else {
// Otherwise, if %40 does exist in the username, replace it with the @ sign
// and populate the UPN into the userNameInput of the page, and put the
// focus on the password.
var userNameValue = cc_login_name.replace('%40', '@');
document.getElementById("userNameInput").value = userNameValue;
document.getElementById("passwordInput").focus();
}
}
}
}
在此行中,如果UPN用作登录UID,则必须修改domain.com以匹配UCCE代理的域。
var userNameValue = cc_login_name + '@' + 'domain.com';
注意:AD FS默认使用UPN登录。有关如何配置AD FS登录页以允许sAMAcc的信息,请参阅UCCE功能指南的单点登录一章(可选)自定义Windows Server 2012 R2中的AD FS登录页以允许用户ID部分countName登录。
如果应在AD FS登录页上输入sAMAccountName(无域的UID)用户名,请使用以下代码段:
// Get cc_username as login ID from HTTP Cookie header
if (document.cookie) {
// If the position of cc_username in the cookie is the first position, 0...
if (document.cookie.indexOf('cc_username') == 0) {
// Split the cookie into an array with the delimitor being '='
var cookies = document.cookie.split('=');
// If the first element of the array is cc_username then...
if (cookies[0] == 'cc_username') {
// ...the second element will be the actual username and we should save that.
var cc_login_name = cookies[1];
}
// Customize Login page: remove domain if needed to use login ID in sAMAccount form
// If the parsed login is not null, do the following logic
if (cc_login_name != null) {
// If %40 (encoded '=') DOES exist in the login name...
if (cc_login_name.indexOf('%40') != -1) {
// ...then split the login into an array about the @ sign and only keep the username.
var domainLogin = cc_login_name.replace('%40', '@')
var noDomainLogin = domainLogin.split('@');
var userNameValue = noDomainLogin[0];
// Populate the sAMAccountName into the userNameInput of the page, and put the focus
// on the password.
document.getElementById("userNameInput").value = userNameValue;
document.getElementById("passwordInput").focus();
} else {
// Otherwise, if %40 does not exist in the username, there is no "@domain",
// so populate the sAMAccountName into the userNameInput of the page,
// and put the focus on the password.
document.getElementById("userNameInput").value = cc_login_name;
document.getElementById("passwordInput").focus();
}
}
}
}
注意:代码中的//符号表示注释。如果需要,可以删除这些行。其目的是帮助理解Javascript代码。
步骤3.使用以下PowerShell命令保存onload.js并将其重新加载到新的AD FS Web主题:
使用默认主题的模板创建自定义AD FS主题:
PS C:\> New-AdfsWebTheme -Name custom -SourceName default
将自定义AD FS主题设置为活动:
PS C:\> Set-AdfsWebConfig -ActiveThemeName自定义
将修改的onload.js文件加载到自定义主题:
PS C:\> Set-AdfsWebTheme -TargetName custom -AdditionalFileResource @{Uri='/adfs/portal/script/onload.js';path="c:\temp\adfs\script\onload.js"}
注意:无需重新启动AD FS。活动主题会自动修改。
验证
使用本部分可确认配置能否正常运行。
使用启用SSO的帐户登录Finesse或CUIC,并且使用sAMAccountName或UPN作为登录ID(取决于AD FS配置),并观察在AD FS登录页上,用户ID会自动填充以关注密码提示字段。只需输入密码即可继续登录。
故障排除
本部分提供了可用于对配置进行故障排除的信息。
如果出现问题,Web浏览器开发人员工具用于检查onload.js的修改是否插入到返回的HTML页中,以及Web浏览器控制台中是否发现任何错误。
相关信息