spnego
当将运行Microsoft®Windows®的计算机连接到域,并且用户使用其域凭据登录到计算机时,Windows操作系统将与域控制器联系以对用户进行身份验证。 在许多组织中,用户具有运行连接到域控制器的Windows操作系统的计算机,并且他们具有要登录到其计算机的域用户名和密码,这种情况在许多组织中很常见。 如果用户经常需要连接到在公司内部网中运行的Web应用程序,则需要提供相同的域用户名和密码。
本教程系列的第3部分将展示如何扩展第1 部分和第2 部分中介绍的SSO解决方案,以使用现有的Microsoft Active Directory基础结构进行身份验证和授权。 您将看到如何以安全的方式访问云应用程序,而不会挑战用户的凭据。
要完成本部分中的解决方案,您必须已经阅读并完成了第1 部分和第2 部分中的步骤。 另外,您必须确保网络上安装了Windows Server操作系统。
假设您登录到运行Windows并连接到Microsoft域的计算机。 当您在操作系统登录表单中输入域,用户名和密码时,将向Microsoft Active Directory发出请求以对您的凭据进行身份验证。 浏览器从这台计算机连接到在IBM WebSphere Liberty应用程序服务器上运行的Web应用程序。
当您请求受基于角色的授权(Java身份验证和授权服务)安全性保护的资源时,如果尚未进行身份验证,浏览器会提示您提供用户名和密码。 您必须登录,因为应用程序服务器检测到您未通过身份验证,并将WWW-Authenticate:Basic标头添加到HTTP响应中。 浏览器将截取该标头,并显示登录表单。 您输入您的凭据。 然后,应用程序服务器根据其用户注册表对其进行检查,建立安全上下文,并执行基于角色的授权,以查看是否允许您访问所需的资源。
现在,假设应用程序服务器配置有轻型目录访问协议(LDAP)用户注册表,该注册表指向登录您的计算机时已通过身份验证的Microsoft Active Directory。 在这种情况下,您可以使用域凭据也登录到Web应用程序。
您还可以配置承载应用程序的应用程序服务器和浏览器,以与计算机的操作系统API协商身份验证,而不会提示您登录。特别是,您可以在服务器上配置简单和受保护的GSS-API协商机制 (SPNEGO)功能。托管Web应用程序的WebSphere Liberty应用程序服务器。
通过启用此功能,当您将浏览器连接到Web应用程序并请求受保护的资源时(如果未通过身份验证),服务器会将WWW-Authenticate:Negotiate标头添加到HTTP响应中。 如果您的浏览器配置为授权资源所属域的协商,则它将拦截标头并调用Windows API从Microsoft Active Directory获取Kerberos票证(SPNEGO令牌)。 SPNEGO令牌从浏览器发送回应用服务器。 SPNEGO功能会验证令牌,并使用它从LDAP(Microsoft Active Directory)用户注册表中检索用户名和组。 然后,应用程序服务器使用用户名和组来创建经过身份验证的主题,并对您请求的资源执行基于角色的授权检查。
要探索SPNEGO认证过程的详细信息,请参阅IBM知识中心中的使用SPNEGO Web认证的HTTP请求的单点登录 。
SPNEGO身份验证可以与服务提供商发起的SSO流程共存,这在第1部分中已经说明,因为它们具有独立的任务。 在本部分的解决方案中,仅在服务提供者将用户重定向到身份提供者(IdP)以执行身份验证并完成其任务之前,身份提供者生成SAML令牌之后,才进行SPNEGO身份验证。 下图说明了刚刚描述的SSO序列。
在本教程中,您将在Windows Server上启用Microsoft Active Directory域服务 (AD DS)角色。 然后,您创建一个Microsoft域网络。 (在此示例中,我们使用samlsso.sample.net
。)AD DS在Windows 2000 Server,Windows Server 2003,Windows Server 2008和Windows Server 2012上受支持。它不适用于其他Microsoft操作系统。 在本教程中,我们使用Windows Server 2008 R2。
您在AD DS中创建所需的用户和组以及服务主体名称(SPN) 。 IdentityServer使用SPN对AD DS执行Kerberos身份验证。 您配置IdentityServer。 您将第1部分中的基本用户注册表替换为指向AD DS的LDAP用户注册表,然后安装并配置SPNEGO功能。
最后,使用操作系统凭据(Microsoft域凭据)在第1 部分和第2 部分中创建的应用程序之间执行单点登录(SSO)。 您设置Windows计算机以连接到Microsoft域,并配置计算机的浏览器以协商Kerberos票证。
下图说明了在此部分中配置的解决方案体系结构。 域网络(在左下角的红色框中)和用于实现SSO的通信协议包括:
IdentityServer是我们解决方案中唯一拥有用户注册表的服务器,这意味着:
要配置Active Directory域服务,首先,如果尚未安装AD DS角色,请在Microsoft Windows Server上安装它。 然后,您创建Microsoft域网络。 接下来,您配置所需的用户和组以运行示例以及SPNEGO身份验证所需的SPN。
在开始之前,请使用管理员帐户登录到Microsoft Windows Server。 然后,要安装Active Directory域服务:
ServerManager.msc
。 此时,安装开始。 您可以在向导的“ 进度”选项卡上对其进行监视。 安装完成后,将显示“ 结果”页面,您可以在其中看到所有功能均已成功安装。 在此示例中,仅安装了AD DS,但如果未找到其他依赖项(例如.NET Framework功能),则可能会看到它们已安装。
为Microsoft Windows网络创建域:
samlsso.sample.net
。 单击下一步 。
Passw0rd
。 单击下一步 。 如果要在Windows Server 2012上安装,则向导会稍有不同。 有关详细信息,请参阅安装新的Windows Server 2012 Active Directory林(级别200) 。
gpmc.msc
。 填充Microsoft Active Directory中的用户和组。 首先,创建所需的组:
要创建组:
ServerManager.msc
。 IdentityRequestors
。 现在创建了IdentityRequestor组。
要创建所需的用户,首先,创建一个技术用户,稍后在IdentityServer Liberty配置文件中对其进行配置以连接到AD DS。 您不需要在以前设置的任何组中使用此用户,因为不需要访问该应用程序。 该用户将仅属于“域用户”组,这是新用户的默认组。
要创建用户:
ServerManager.msc
。 wasuser
。 单击下一步 。 Passw0rd
作为容易记住的密码。 清除所有复选框选项,然后选择“ 密码永不过期” 。 单击下一步 。 现在创建了用户wasuser
。
IdentityRequestors
。 您也可以单击“ 高级”和“立即查找”以获取所有对象的完整列表。 单击确定 。 IdentityRequestors; FrontendServiceUsers
IdentityRequestors; FrontendServiceUsers
IdentityRequestors; FrontendServiceUsers; CloudServiceUsers
IdentityRequestors; FrontendServiceUsers; CloudServiceUsers
IdentityRequestors; FrontendServiceUsers; CloudServiceUsers; LocalServiceUsers
IdentityRequestors; FrontendServiceUsers; CloudServiceUsers; LocalServiceUsers
提示:我们列出了用分号分隔的组。 分号字符是搜索对象向导中的特殊条目分隔符,可用于将组复制并粘贴到“ 输入对象名称以选择”区域中。
Active Directory已配置。 接下来,生成映射,以便WebSphere Liberty可以连接到AD DS。
现在,您准备配置,以便IdentityProvider可以登录到AD DS。 您将wasuser
映射到SPN。 用户PC使用服务主体名称(格式为HTTP/
)来请求Kerberos票证。 身份提供者还使用此名称登录AD DS并为用户检索组。 为此,您生成一个密钥文件,IdentityProvider使用该密钥文件登录到域(在示例中为samlsso.sample.net
)。 如果使用过期密码创建了wasuser
,则每次更改wasuser
的密码时,都必须重复此过程以重新生成密钥并将其导出到IdentityProvider计算机。
要将用户映射到SPN并为运行IdentityProvider的计算机生成密钥,请使用带有-mapuser
选项的ktpass
命令:
ktpass -out spnmap.keytab -princ HTTP/[email protected] -mapuser wasuser -pass Passw0rd -ptype KRB5_NT_PRINCIPAL
在命令参数中,您会看到[email protected]
,这是运行IdentityProvider的计算机的完整主机名。 您必须使用此命令中写的小写和大写字母。 如果您没有遵循正确的大小写,那么来自WebSphere Liberty的认证将失败。
运行ktpass
命令后,在wasuser
属性窗口的“ 帐户”选项卡上查看“ 用户登录名”字段时,您会看到它从wasuser
更改为HTTP/win7pro.samlsso.sample.net
,即SPN。
setspn -l wasuser
在输出中,您将看到SPN映射到wasuser
可分辨名称:
Registered ServicePrincipalNames for CN=wasuser,CN=Users,DC=samlsso,DC=sample,DC=net:
HTTP/win7pro.samlsso.sample.net
spnmap.keytab
文件复制到安装IdentityServer的计算机中,路径为\IdentityServer\resources\security\spnego\
。 您创建spnego文件夹,因为它不存在。
是WebSphere Liberty安装的服务器文件夹,在第1部分中创建了IdentityServer概要文件。 在此示例中,身份提供者计算机的主机名是win7pro.samlsso.sample.net
。
IdentityServer所需的项目可在GitHub上找到 。 您可以从此压缩文件下载完整的集合, 然后将其解压缩到安装Eclipse工作区的机器的本地文件系统中。
我们通过使用以下占位符来引用本地文件系统路径:
(例如: C:\programs\wlp-16.0.0.3
)
用于WebSphere Liberty bin路径(例如: C:\programs\wlp-16.0.0.3\bin
)
用于WebSphere Liberty服务器的安装路径(例如: C:\programs\wlp-16.0.0.3\usr\servers
) 在开始本部分之前,请确保运行IdentityServer的计算机可以连接到在LDAP端口上运行AD DS的Windows Server计算机。 (在本教程中,我们使用默认值389
)
打开您在第1部分中创建的Eclipse工作区,并导入示例项目:
现在,您的工作区类似于以下示例。
由于IdentityProvider功能是Web捆绑包,因此SPNEGO筛选器不起作用。 您刚刚导入的两个项目是一种变通方法,它允许SPNEGO身份验证和SAML生成以最小的努力共存于同一台服务器上。 请记住,身份提供者不是完全兼容的IdP实现。 如果你需要移动到生产,你可能想采取一个产品 ,它提供了IDP实施和支持。
部署先前导入到服务器的项目:
您可以在IdentityServer server.xml
文件中配置指向Windows Server AD DS的新用户注册表:
server.xml
文件,请单击“ 源”选项卡以切换到XML视图。
元素中:
javaee-7.0
localConnector-1.0
identityProvider-1.0
ldapRegistry-3.0
ldapRegistry
配置元素具有以下属性:
baseDN
是LDAP格式的域。 DN(专有名称)用于baseDN和bindDN,因为我们使用的是LDAP用户注册表。 bindDN
和bindPassword
是您在配置用户时在AD DS中创建的技术用户。 Liberty服务器使用此用户连接到AD DS。 host
是安装AD DS的Windows Server(在此示例中为Base-Win2k8x64.samlsso.sample.net
)。 port
是默认的LDAP端口389,AD DS正在其上侦听LDAP请求。 identityProvider
配置元素:
identityProvider
配置具有以下属性:
hostname
被改变以反映将要用作SPN由Windows客户机以请求的Kerberos票证到AD DS的身份提供者的主机名。 webContextPath
是新的Web上下文,用于SP发起的SSO请求SAML令牌。 您需要此解决方法,因为身份提供程序未调用SPNEGO筛选器,因为它打包为Web捆绑包。 要安装spnego-1.0
Liberty功能,请在创建IdentityServer的计算机上打开命令提示符:
cd
。 spnego-1.0
运行以下命令,以下载并安装启用SPNEGO Web身份验证所需的功能: installUtility install spnego-1.0
成功完成下载和安装后,您会看到以下消息:
All assets were successfully installed.
Start product validation...
Product validation completed successfully.
\IdentityServer\resources\security\spnego\
文件夹中创建一个名为krb5.ini
的新文件,您之前已在其中复制了spnmap.keytab
文件。 krb5.ini
文件中: [libdefaults]
default_realm = SAMLSSO.SAMPLE.NET
default_tkt_enctypes = rc4-hmac
default_tgs_enctypes = rc4-hmac
kdc_default_options = 0x54800000
[realms]
SAMLSSO.SAMPLE.NET = {
kdc = Base-Win2k8x64.samlsso.sample.net:88
default_domain = samlsso.sample.net
}
[domain_realm]
.samlsso.sample.net = SAMLSSO.SAMPLE.NET
请注意以下几点:
domain
。 如果您拥有其他域, samlsso.sample.net
用您的域替换samlsso.sample.net
并使用大写字母。 kdc
参数。 在此参数中,输入运行AD DS的Windows Server的主机名。 spnego-1.0
功能添加到现有的
元素中:
javaee-7.0
localConnector-1.0
identityProvider-1.0
ldapRegistry-3.0
spnego-1.0
server.xml
文件:
krb5Config
和krb5Keytab
参数指向保存所需SPNEGO文件的文件系统。
因为您需要使用身份提供者的完整主机名来激活SPNEGO协商,所以必须更改FrontendServer上的idp-metadata.xml
文件并将服务器配置重新发布到IBM Cloud:
http://localhost/idp/SAMLResource
链接。 idp-metadata.xml
文件。 将文件保存在\FrontendServer\resources\security\
目录中。 现在,您已完成LDAP和SPNEGO配置。 下一步是登录到运行Windows客户端的计算机。 (在本教程中,我们使用Microsoft Windows7。)您使用先前在AD DS中配置的用户(bob,rob,max或alice)之一进行最终的浏览器配置,并测试完整的SSO方案。
您应该有一台运行Windows客户端操作系统(例如Windows 7)并连接到您的Microsoft域(本教程中为samlsso.sample.net
)的计算机。 如果没有运行,则可以按照以下步骤中的说明进行配置。
开始之前,请从这台机器上:
443
)上使用其完整主机名(本教程中为win7pro.samlsso.sample.net
)连接到IdentityProvider计算机。 如果您已经有一台连接到现有AD DS的计算机,请转到步骤3b继续浏览器配置。
samlsso.sample.net
)。 单击确定 。
Welcome to the domain
。 单击确定 。 Passw0rd
alice
Passw0rd
。 在Windows登录表单下方,您会看到旧Windows格式的AD DS域(本教程中为SAMLSSO
)。
要与身份提供者协商Kerberos票证,必须首先配置Web浏览器。 您可以按照以下各节中的说明设置Firefox或Internet Explorer,以测试解决方案。
about:config
。 network.nego
。 (Firefox在键入时过滤属性列表。) samlsso.sample.net
)。 samlsso.sample.net
)。
*.samlsso.sample.net
。 如果您有其他域,请选择以*.
为前缀的域*.
。 点击添加 。
单击关闭 。
从Windows客户端,打开您配置的浏览器,然后转到: https://FrontendServices.mybluemix.net/FrontendWeb
: https://FrontendServices.mybluemix.net/FrontendWeb
将域FrontendService.mybluemix.net
替换为您在本系列的第2部分中创建的域。
查看网络跟踪,以查看由SP启动的SSO的作用。 如果使用的是Firefox,请按F12键,或者从“ 选项”菜单中选择“ 开发人员”以启用工具栏。
该序列与第1部分中的序列相似。 您有两个向身份提供者的请求( win7pro.samlsso.sample.net
)。 区别在于,由于来自服务器的第一个响应包含WWW-Authenticate:Negotiate标头,因此浏览器向AD DS调用服务请求以获取票证。
如果您在Windows客户端计算机或AD DS计算机的网络接口上跟踪请求,则可以在客户端Microsoft Windows和AD DS之间看到该请求。
在下图中,您将看到TGS-REQ ,它是客户端( 192.168.1.101
)向AD DS( 192.168.1.198
)请求以获得Kerberos票证的请求。 服务器名称是在AD DS中配置的服务主体名称: HTTP/win7pro.samlsso.sample.net
。
在下图中,您可以看到TGS-REP ,它是AD DS发送回客户端的响应,其中包含Kerberos票证。
浏览器收到Kerberos票证后,它将票证发送到请求的Authorization标头中的身份提供者,如下图所示。
在本教程中,您实现了完整且安全的SSO架构,并已部署到IBM Cloud。 您将SSO解决方案与Microsoft Active Directory集成在一起。 您配置了SPNEGO Web身份验证,以便用户不必提供其凭据。
通过完成本教程系列,您现在可以跨多个域基于SAML断言设计和实现SSO解决方案。 如果您正在使用LDAP用户注册表,则可以将其与现有的安全性基础架构集成。 您甚至可以根据需要将应用程序部署在混合云中。
翻译自: https://www.ibm.com/developerworks/library/mw-1703-maurip3/index.html
spnego