简介
SAML标准定义了可靠服务器之间安全信息交换的框架。要了解更多背景信息,请参阅Beth Linker编写的SAML简介(中文版,Dev2Dev,2006)。本指南讲述了如何在两个Web应用程序之间设置SAML授权,并提供了这些应用程序的源代码。
本指南描述了涉及两个Web应用程序的简单示例;appA部署在源(本地)站点,而appB部署在目标(远程)站点。您将学习到如何使用WebLogic Server 9.2 Administration Console来配置这些应用程序并参与使用SAML实现SSO的过程。
源站点提供身份验证服务,并且当目标站点请求时,可使用SAML Inter-site Transfer Service (ITS)安全地传递身份验证详细信息。源站点的服务器包含ITS servlet,这个可寻址的组件提供了SAML处理功能,例如凭证生成及将用户重定向到目标站点的能力。
图1显示了SSO过程中源站点和目标站点之间的基本交互。
图 1. 使用SAML的单点登录过程中源站点和目标站点之间的交互
完整的处理流程如下:
- 通过提供用户凭据,用户的浏览器就可以访问应用程序appA(源站点),该程序位于名为domainA的WebLogic Server域。
- 应用程序appA将用户凭据传递到身份验证服务提供者。
- 如果身份验证成功,则建立已通过身份验证的会话;同时显示appA欢迎页面。
- 用户单击该欢迎页面上的链接,就可以访问应用程序appB(目标站点)的安全Web页面。应用程序appB位于另一个名为domainB的WebLogic Server域。这将触发对Inter-Site Transfer Service (ITS) servlet的调用。
- ITS servlet通过调用SAML Credential Mapper请求调用断言。SAML Credential Mapper返回该断言。同时也返回目标站点应用程序Web页面(一个安全的appB Web页面)的URL;如果源站点配置为使用POST配置文件,则SAML Credential Mapper还返回相应POST表单的路径。
- SAML ITS servlet产生包含生成断言的SAML响应;并对其进行签名、Base-64编码、嵌入HTML表单,然后将该表单返回到用户的浏览器。
- 用户的浏览器将该窗体以POST格式发送到目标站点的Assertion Consumer Service (ACS)。
- 验证该断言。
- 若断言成功,用户将被重定向到目标,即appB应用程序的安全Web页面。
- 用户登录到目标站点appB应用程序,无需在appB处重新验证身份。
以上所述的单点登录过程不需要开发人员进行编码(当然,为应用程序appA和appB编码除外),另外通过使用Administration Console即可轻松配置单点登录。
使用WebLogic Administrative Console进行SAML配置
在开始SAML配置之前,前几个步骤将创建并设置示例应用程序appA和appB的服务器环境。
步骤一:创建SAML源站点域和目标站点域及应用程序服务器
本指南中的示例应用程序位于本地主机上的两个不同的域;因此,第一个步骤是创建运行于特定端口的域和服务器,如表1所示。
主机 | 应用服务器 | 应用程序名称 | 端口 | SSL端口 | |
---|---|---|---|---|---|
SAML源站点域:domainA | localhost | AdminServer | appA | 7001 | 7002 |
SAML目标站点域 D:domainB | localhost | AdminServer | appB | 7003 | 7004 |
表 1. 示例应用程序域及应用服务器
使用Domain Configuration Wizard创建表1中所示的域;并使用WebLogic Server 9.2 Administration Console更新相应的侦听端口。
步骤二:创建用户
为了简便起见,本指南使用各域中的默认安全域,并以同样的默认域名进行命名,即myrealm。在每个域的myrealm域中分别创建一个用户ssouser。此外,也可在集中化的外部LDAP存储中创建该用户,并将这两个域配置为使用这个共同的存储进行身份验证。
此处创建的用户ssouser将验证domainA中的应用程序appA;然后,使用SSO便可直接访问位于domainB中的应用程序appB。
域 | 用户名/密码 | |
---|---|---|
SAML源站点域:domainA | myrealm | ssouser/demosaml |
SAML目标站点域:domainB | myrealm | ssouser/demosaml |
表 2. 参与单点登录的用户
如表2所示,在这两个域中名为myrealm的安全域内创建用户ssouser。
步骤三:创建并部署Java EE Web应用程序appA和appB
appA的示例应用程序源代码可点击此处进行下载。将现有的Web应用程序导入到WebLogic WorkShop Studio或者诸如Eclipse的其他任何IDE。
应用程序appA配置为使用基于FORM的身份验证。该应用程序部署在SAML源站点域(即domainA)。admin文件夹下名为auth.jsp的appA JSP页面要求已通过身份验证的用户拥有admin角色,才能进行访问。在weblogic.xml中,admin角色映射到名为ssouser的主体。图2显示了web.xml中的安全配置。
<display-name>Saml Source Site Application</display-name>
<security-constraint>
<web-resource-collection>
<web-resource-name>SecurePages</web-resource-name>
<description>These pages are only accessible by authorized users.</description>
<url-pattern>/admin/*</url-pattern>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<description>These are the roles who have access.</description>
<role-name>admin</role-name>
</auth-constraint>
<user-data-constraint>
<description>This is how the user data must be transmitted.</description>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>myrealm</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/fail_login.htm</form-error-page>
</form-login-config>
</login-config>
<security-role>
<description>These are the roles who have access</description>
<role-name>admin</role-name>
</security-role>
例 1. 应用程序 appA - web.xml代码片断
当用户试图访问/admin/auth.jsp页面时,将显示配置好的login.jsp登录页面,要求用户提供身份验证凭据。在提交详细资料 后,该容器将对用户ssouser进行身份验证。如果验证成功,将显示auth.jsp页面。在进一步访问auth.jsp页面之前,我们将在目标站点域 (即domainB)创建应用程序appB。
appB示例应用程序源代码可在Download section(下载专区)进行下载。应用程序appB配置为使用CLIENT-CERT,因此它将使用身份断言来进行验证。该应用程序应部署在SAML目标站点域(即domainB)。位于/admin文件夹中名为services.jsp的appB JSP页面要求已成功通过身份验证的用户拥有admin角色,才能进行访问。在weblogic.xml中,admin角色映射到名为ssouser的主体。图3显示了appB的web.xml配置的摘录:
<display-name>SAML Destination Site Application</display-name>
<!-- ... -->
<security-constraint>
<web-resource-collection>
<web-resource-name>SecurePages</web-resource-name>
<description>These pages are only accessible by authorized users.</description>
<url-pattern>/admin/*</url-pattern>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<description>These are the roles who have access.</description>
<role-name>admin</role-name>
</auth-constraint>
<user-data-constraint>
<description>This is how the user data must be transmitted.</description>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>myrealm</realm-name>
</login-config>
<security-role>
<description>These are the roles who have access.</description>
<role-name>admin</role-name>
</security-role>
例2. 应用程序 appB - web.xml代码片断
编译并构建每个应用程序的WAR文件(如appA.war、appB.war)。要进行部署,将appA.war和appB.war文件分别复制到domainA和domainB的autodeploy文件夹中。重新启动应用服务器,并测试不具备SSO功能的应用程序的行为。
SAML配置完成之后,在appA(SAML源站点)通过身份验证的用户ssouser就可以直接访问appB(SAML目标站点)的services.jsp页面,无需再次提供凭据。
步骤四:生成并注册SSL证书
为保障SAML源站点和目标站点之间的通信安全,应该将源站点和目标站点之间的通信进行加密。此外,应该使用证书来验证对方在SAML交互过程中的身份。在这个步骤中,我们将创建并注册在源站点和目标站点之间通信所使用的证书。
使用keytool实用工具(JDK的一部分)生成密匙。默认情况下,已为domainA和domainB配置了名为DemoIdentity.jks的密钥库。
以下将介绍如何生成私有密匙和证书,以进行测试:
- 打开DOS命令窗口,将目录更改为WEBLOGIC_HOME/server/lib。
- 运行keytool命令来生成密匙,见下图。
keytool -genkey -keypass testkeypass -keystore DemoIdentity.jks -storepass DemoIdentityKeyStorePassPhrase -keyalg rsa -alias testalias
图2. 生成SSL测试证书的截屏
如图2所示,使用-export选项运行keytool命令来生成名为testalias.der的密匙文件:
keytool -export -keypass testkeypass -keystore DemoIdentity.jks -storepass DemoIdentityKeyStorePassPhrase -alias testalias -file testalias.der
SAML配置
首先进行SAML源站点配置。
步骤五:配置SAML源站点domainA
在这个步骤中,我们将创建并配置一个SAML Credential Mapper V2实例。作为SAML安全断言的生成程序,SAML Credential Mapper可以使domainA成为使用SAML实现单点登录的源站点。
SAML安全断言是一种信息包,包含SAML授权(指的是断言方)提供的一个或多个声明。声明有如下几种类型:身份验证声明、特性声明以及授权决策声明等。
先配置一个SAML Credential Mapper V2实例(注:BEA WebLogic Server 9.2不支持SAML Credential Mapper V1):
- 登录到domainA上的WebLogic Server Administration Console
(http://localhost:7001/console)。
- 在管理控制台中,在Domain Structure窗口中选择Security Realms。
- 选择一个安全域;默认使用的域为myrealm。
- 选择Providers选项卡,然后选择Credential Mappings选项卡。
- 如果SAMLCredentialMapper不存在,那么创建一个新的SAMLCredentialMapper,如图3所示。
图3. 创建新的SAML凭据映射提供程序
- 选择 SAMLCredentialMapper,然后选择Provider Specific。
- 选择Change Center窗口中的Lock and Edit;这允许您编辑SAMLCredentialMapper设置。
- 编辑发行方URI http://www.bea.com/demoSAML。这个独特的URI将告知目标站点(domainB/appB)SAML信息的来源;并将其与密匙进行匹配。通常,该URL用来保证唯一性。
- 输入Signing Key Alias(testalias)和Signing Key Pass Phrase(testkeypass)。这些值在生成密钥库时使用过。
- 为Live and Cred Cache Min Viable TTL设置默认时间及其他值,如图4所示。
图 4. SAML 凭据映射提供程序设置
- 单击Save。
- 单击Change Center窗口中的Activate Changes。
此处的SAML凭据映射提供程序配置为使domainA以源站点身份进行运作(SAML安全断言的源);还配置为使用在步骤四中生成的密匙库。
步骤六:配置信任方属性
这一步将创建并配置信任方。将WebLogic Server配置为SAML的安全断言源时,您需要注册可能要求接受SAML断言的信任方。对于SAML信任方,您可以指定以下几项:所使用的SAML配置文件、信任方的详细信息及信任方的断言中所期望的特性。
信任方决定其是否信任断言方所提供的断言。SAML定义了一些机制,能够使信任方信任向其提供的断言。
- 单击Management选项卡中的Relying Parties。
- 单击Relying Parties表中的New。
- 在Profile下拉菜单中,选择Browser/POST。在Description字段中,输入名称demoSAML来识别信任方,如图5所示。
图 5. 信任方的配置
- 设置信任方的各种值,如表3所示。
参数 | 值 |
---|---|
启用 | 选中该复选框(真值) |
目标URL | http://localhost:7003/appB/admin/services.jsp |
断言使用者URL | https://localhost:7004/samlacs/acs |
断言使用者参数 | APID=ap_00001 |
要求签名 | 选中该复选框(真值) |
包括Keyinfo | 选中该复选框(真值) |
表 3. 信任方(rp_00001)的各种值
尽管信任方可选择信任向其提供的关于用户ssouser的断言,但domainB中的目标站点应用程序appB的本地访问策略才能决定该主题(ssouser)是否可以访问本地资源。
步骤七:配置源站点SAML
在这个步骤中,我们将对运行应用程序appA的服务器实例配置各种联邦服务源站点设置。这些设置将使运行在domainA上的服务器实例成为SAML源站点,定义源站点URI及服务URI,添加证书以对断言进行签名并配置检索断言的SSL。
- 在管理控制台中的Domain Structure窗口中选择Environment,然后选择Servers。
- 选择AdminServer,然后在Settings for AdminServer中,单击SAML 1.1 Source Site选项卡上的Federation Services,如图6所示。
图6. 源站点的配置
- 如表4所示设置源站点的各种值。
参数 | 值 |
---|---|
启用源站点 | 选中该复选框(真值) |
源站点URL | http://localhost:7001/appA |
Signing Key Alias | testalias |
Signing Key Passphrase | testkeypass |
Intersite Transfer URIS | /samlits_cc/its(保留其他值) |
ITS要求SSL | 选中该复选框(真值) |
断言检索URI | /samlars/ars |
ARS要求SSL | 选中该复选框(真值) |
表 4. 源站点的各种值
步骤八:配置SAML目标站点domainB
下面将开始配置SAML目标站点。在这个步骤中,将首先创建并配置一个SAML Identity Assertion Provider V2实例。作为SAML安全断言的使用者,SAML Identity Assertion提供者使得WebLogic Server成为使用SAML实现单点登录的目标站点。SAML Identity Assertion提供者通过核对签名并根据提供者维护的证书登记处验证该证书是否可信,从而对SAML断言进行验证。首先要做的是创建一个SAML Identity Assertion Provider V2实例,并将步骤四中所生成的证书导入到提供者的证书登记处。
导入证书:
- 将前面生成的密匙文件(testalias.der)复制到D:/bea/weblogic92/server/lib目录下。
- 登录到domainB的WebLogic Server Administration Console。
- 选择安全域myrealm。
- 选择Providers选项卡,然后选择Authentication选项卡。
- 若SAMLIdentityAsserter不存在,则先创建一个新的SAMLIdentityAsserter,如图7所示。身份断言程序允许WebLogic Server通过验证用户来建立信任。
图7. 创建新的身份断言程序
- 单击SAMLIdentityAsserter中的Management选项卡,然后单击Certificates。
- 单击Certificates对话框中的New,如图8所示。
图 8. 创建新的身份断言程序证书
- 在Alias字段中输入该证书的名称。推荐做法是使用创建证书时使用的名称。
- 在Certificate File Name字段中输入证书的路径。
- 单击Finish。若已成功,则会显示“The certificate has been successfully registered.”消息。
步骤九:配置断言方属性
在该步骤中,将创建并配置断言方。当用户将WebLogic Server配置为SML安全断言的使用者时,您需要注册将提供SAML断言的断言方。对于SAML断言方,可以指定以下几项:所使用SAML配置文件、 断言方的详细信息以及期望断言方提供的断言中的特性。
断言方断言用户已通过身份验证并对其授予相关特性。例如,用户ssouser通过密码机制通过了该域的身份验证。断言方亦称为SAML权威。
- 单击Management选项卡上的Asserting Parties。
- 单击Asserting Parties表中的New。
- 在Profile下拉菜单中,选择Browser/POST。在Description字段中输入名称demoSAML来识别断言方,如图9所示。
图 9. 创建新的断言方
- 设置断言方的各种值,如表5所示。
参数 | 值 |
---|---|
启用 | 选中该复选框(真值) |
目标URL | http://localhost:7001/appA |
POST签署的证书别名 | testalias |
Source Site Redirect URI | /appB/admin/services.jsp |
Source Site ITS URL | https://localhost:7002/samlits_ba/its |
源站点ITS参数 | RPID=rp_00001 |
发行方URI | http://www.bea.com/demoSAML |
要求签名 | 选中该复选框(真值) |
断言签署的证书别名 | testalias |
表 5. 断言方(ap_00001)的各种值
步骤十:配置SAML 1.1目标站点
在这个步骤中,我们将为运行应用程序appB的服务器实例配置各种目标站点设置。这些设置使得运行在domainB上的服务器实例作为SAML目标站点进行工作,定义服务URI(如,Assertion Consumer Service URI),添加证书以便对POST配置文件响应进行签名以及配置Assertion Consumer Service的SSL。
- 在管理控制台中,选择Environment,然后选择Domain Structure窗口中的Servers。
- 选择AdminServer,然后选择Settings for AdminServer中的Federation Services及SAML 1.1 Destination Site选项卡。如图10所示。
图10. SAML目标站点的设置
- 设置目标站点的各种值,如表6所示。
参数 | 值 |
---|---|
启用目标站点 | 选中该复选框(真值) |
断言使用者URI | /samlacs/acs |
ACS要求SSL | 选中该复选框(真值) |
SSL客户机身份别名 | testalias |
SSL Client Identity Pass Phrase | testkeypass |
启用POST Recipient Check | 选中该复选框(真值) |
启用POST one Use Check | 选中该复选框(真值) |
Used Assertion Cache Properties | APID=ap_00001 |
表 6. 目标站点的各种值
对单点登录进行测试
打开浏览器,指向URL http://localhost:7001/appA/,以便对单点登录进行测试。为appA配置的基于FORM的身份验证将显示login.jsp页面;如图11所示。输入在步骤二中生成的ssouser值及demosaml值。
图11. 显示appA登录的浏览器
将使用为domainA配置的默认身份验证程序对该用户进行验证。
然后将显示auth.jsp页面。该页面包含指向appB的链接(http://localhost:7003/appB/admin/services.jsp),如图12所示。单击该链接,将触发对ITS servlet的调用,并导致生成断言,然后将控制传送至目标站点。
图 12. 显示appA成功登录目标站点(domainB上的appB)链接的浏览器
一旦在目标站点验证该断言,ssouser便可访问services.jsp页面,如图13所示。
图13. 显示使用SSO成功登录到appB的浏览器
如果ssouser首先访问目标站点将会怎样?在步骤九中,一旦配置完断言方,则Source Site Redirect URI被设置为ITS URL https://localhost:7001/samlits_ba/its;未通过身份验证的用户将被重定向到ITS URL https://localhost:7001/samlits_ba/its。 这样做是为了支持先访问目标站点的情况,即如果用户试图未经验证便访问目标站点URL,将被重定向到源站点进行验证,然后获得SAML断言。源站点处的 ITS servlet要求用户提供用户名和密码。一旦验证成功,就会重定向到目标站点,同时显示/appB/admin/services.jsp页面。
调试注意事项
您可以启用SAML安全调试来了解源站点和目标站点如何通过SAML SSO进行交互。要启用SAML安全调试:
- 选择管理控制台中的Environment,然后选择Domain Structure窗口中的Servers。
- 选择AdminServer,然后选择Debug选项卡。
- 选择Change Center窗口中的Lock and Edit,这将允许您编辑调试设置。
- 依次单击Debug Scope and Attributes中的weblogic > security > saml节点。然后,如图14所示,选中复选框以启用SAML调试。
- 单击Change Center窗口中的Activate Changes。
图14. 显示启用SAML调试的WebLogic控制台
然后,便可浏览domainA及domainB的AdminServer登录文件,以调试与SAML相关的问题(图15)。
图 15. 显示SAML交互的AdminServer登录
下载
本指南的示例代码结束语
本指南介绍了如何对SAML源站点域和目标站点域进行配置,以便这些域中的Web应用程序在可靠的联邦环境下运作;而实现的基础在于成功地单点登录到SAML源站点上的Web应用程序。这是完全通过使用管理控制台进行配置的典范,很多应用程序的用户都将直接从中受益。
参考文献
- Beth Linker撰写的SAML简介(Dev2Dev,2006)
- Harold Lockhart撰写的揭开SAML的神秘面纱(Dev2Dev,2006)
- Arvind Tiwari撰写的使用带密钥库的PFX和PEM证书格式(Dev2Dev,2006)– 讲述了更多关于设置证书和密钥库的背景知识
- Configuring Single Sign-On with Web Browsers and HTTP Clients –产品文档,WebLogic Server
- Technical Overview of the OASIS Security Assertion Markup Language (SAML) V1.1 – 关于SAML的OASIS Web站点
![](http://dev2dev.bea.com.cn/images/_.gif)
作者简介 | |
作为加利福尼亚Legislative Counsel Bureau的资深IT专家,Vikrant Sawant 拥有超过14年的软件开发经验;并广泛地从事基于Java和Java EE的项目。 |