注意:Sun Java System Access Manager 以前称为 Sun Java System Identity Server,以下简称为 Access Manager。它包括 Sun Java System Directory Server Enterprise Edition,以前称为 Sun Java System Directory Server,以下简称为 Directory Server。
集成 Oracle 9i Application Server(简称为 9iAS)和 Access Manager 的主要原因是在异构企业内通过 Access Manager 实现“单一登录 (SSO)”。Oracle 9iAS 是完整而集成的应用程序服务程序(见下文),Access Manager 通过启用身份管理、目录服务和 SSO 的服务来帮助管理对基于 Web 的资源的安全访问。
使用SSO,用户仅需登录一次就可以在一次会话中访问多个分布式应用程序、服务或受密码保护的站点以及在组件之间进行切换,而不需要重新进行身份验证。因此,SSO 极大地提升和方便了用户体验,加强了整体安全性,减轻了 IT 组织不使用 SSO 将会面对的许多负担,如维护多个用户名和密码,繁重的应用程序管理任务等。
使用 Oracle 9iAS,可以执行以下任务:
- 开发和部署动态 Web 站点和应用程序。
- 创建个性化门户来访问内容和应用程序。
- 实现对门户的无线访问。
- 缓存数据来提高 Web 站点的性能。
- 从站点和应用程序获取业务智能来进行个性化。
- 集成用户、应用程序和业务。
- 管理和保护 Web 基础设施。
此外,Oracle 9iAS 还包含一种针对企业内的各应用程序的 SSO 服务以及用户身份的集中管理。SSO 身份验证可以在本地通过 Login Server 内的查找表进行,或在外部通过存储库(Lightweight Directory Access Protocol (LDAP) 或数据库)进行。
本文描述了集成 Oracle 9iAS Release 1 (R1) 和 Access Manager 以便在 Oracle 9iAS 及其合作伙伴应用程序之间实现 SSO 的过程。它包含下列部分:
Oracle 9iAS R1 的 SSO 概述
Oracle 9iAS R1 的 SSO 适合两种类型的应用程序:
- 合作伙伴应用程序,如 Oracle Portal Server,这些应用程序将身份验证委托给 Login Server,它们通过 Login Server 紧密地集成在一起。
- 外部应用程序,它们是独立的 Web 应用程序,不将身份验证委托给 Login Server。
本文使用合作伙伴应用程序进行描述。
通过使用 SSO 服务,用户在仅对其凭证进行一次身份验证后就可以访问多个合作伙伴应用程序。SSO 通过下列组件发挥作用:Login Server 和 SSO 应用程序编程接口 (API)。应用程序通过 SSO API 与 Login Server 通信及委托身份验证。
下面是典型的 Oracle 9iAS R1 的 SSO 到合作伙伴应用程序流程。此信息来自 Oracle Single Sign-On Application Developer's Guide。
- 用户试图访问合作伙伴应用程序。
- 如果这是会话中用户的第一次访问,应用程序会将用户定向到 Login Server 以获得身份验证凭证。
- Login Server 对用户进行身份验证。过程如下:
- Login Server 检查登录 cookie。
如果存在 cookie,Login Server 通过 cookie 中的加密身份信息对用户进行确认。否则,Login Server 通过登录页面提示用户输入凭证。
- 用户输入用户名和密码后,Login Server 根据本地存储或外地存储库对用户进行身份验证。
- 如果身份验证成功,Login Server 会在用户的浏览器中创建一个登录 cookie,以实现将来的身份验证请求的 SSO。
- Login Server 将用户定向到合作伙伴应用程序。同时,Login Server 通过 URL 中的加密参数将身份验证信息传送给合作伙伴应用程序。
- 一旦合作伙伴应用程序收到身份验证信息,它就会确认用户并执行会话管理任务。
图 1 描述了以上步骤。

集成过程
在这种类型的集成中,Access Manager 位于 Oracle 9iAS Login Server 的前端,仅代表 Login Server 对用户进行身份验证。不过,在身份验证之后 Login Server 负责管理用户账户、验证账户策略、审核、身分验证后生成信任令牌以及将用户重定向到合作伙伴应用程序。合作伙伴应用程序只与 Login Server 交互,而完全不知道与 Access Manager 的集成。
为了向 Login Server 提供创建登录令牌所必需的信息,Access Manager 通过 HTTP 头将用户身份传送给 Login Server。只要登录令牌可用于合作伙伴应用程序,SSO 就可以在环境中正常使用。
下列步骤描述了 Oracle 9iAS R1(完成了与 Access Manager 的集成时)的 SSO 到合作伙伴应用程序流程。
- 用户访问 Access Manager。
- 如果身份验证成功,Access Manager 在用户的浏览器中设置令牌。
- 用户访问合作伙伴应用程序。
- 合作伙伴应用程序不知道 Access Manager 的存在,在用户将 Access Manager SSO 令牌传送到 Login Server 时将用户重定向到 Login Server。
- Login Server 查找自己的登录 cookie。不过,因为 Login Server 已经将身份验证委托给 Access Manager,所以 Login Server 就从 Access Manager 查找令牌。
- Login Server 从 Access Manager 找到令牌,然后通过该信息,从 Oracle Internet Directory 检索相关的用户属性。
- Login Server 设置自己的 cookie,并将用户重定向回合作伙伴应用程序,同时传送包含用户凭证的加密 URL 参数。
注意下列情况:
安装和部署
要配置 Access Manager 和 Oracle 9iAS R1 之间的 SSO 集成,必须设置两个系统:
- 系统 1:安装了 Access Manager 6.1 (已与 Sun Java System Directory Server 5.2 绑定)的计算机。
- 系统 2:安装了下列软件的计算机:
- Oracle 9iAS R1,其包含 Login Server 和 Oracle Portal Server,这两个组件用于测试集成
- Apache Web Server 1.3.29 的 Access Manager Policy Agent 2.1
下列步骤描述了如何配置系统 1 和 2 来对 Oracle 9iAS R1 安装和部署 Access Manager SSO 解决方案。
- 在系统 2 上,安装 Oracle 9iAS R1。
- 在系统 1 上,安装 Access Manager 6.1,然后将 Directory Server 与 系统 2 上的 Oracle 用户存储同步。
例如,如果用户 portal30_sso 是有效的 Oracle 用户,该用户也必须是有效的 Directory Serve 用户。同步用户数据的一种方法是对 Directory Server 使用 Oracle 的同步连接器。
有关向 Access Manager 添加用户的详细信息,请参见参考中所列的 Access Manager 和 Directory Server 文档。
- 修改
wwsso_auth_external 中的 authenticate_user 和 get_Authentication_Name 函数,wwsso_auth_external 是用于 Oracle 安装的 ssoxnete.pkb 中的外部身份验证的默认实现文件。
wwsso_auth_external 文件位于 $ORACLE_HOME/portal30/admin/plsql/sso。
下面的粗体文本表示所需的修改。
FUNCTION authenticate_user ( p_user OUT VARCHAR2 ) return PLS_INTEGERIS l_http_header varchar(1000); l_ssouser wwsec_person.user_name%type := NULL;BEGIN l_http_header := owa_util.get_cgi_env('HTTP_IDENTITY_USER'); debug_print('Identity ID : ' || l_http_header); l_ssouser := l_http_header; IF ( (l_ssouser IS NULL) or ( INSTR(l_ssouser, GLOBAL_SEPARATOR) != 0) ) THEN debug_print('malformed user id: ' || l_ssouser || ' returned bywwsso_auth_external.authenticate_user'); RAISE EXT_AUTH_FAILURE_EXCEPTION; ELSE p_user := NLS_UPPER(l_ssouser); return 0; END IF; EXCEPTION WHEN OTHERS THEN WHEN OTHERS THEN debug_print('unknown exception in authenticate_user(p_user)' || sqlerrm); RAISE EXT_AUTH_FAILURE_EXCEPTION; END authenticate_user;FUNCTION get_authentication_name RETURN VARCHAR2ASBEGIN RETURN 'Sun Java System Access Manager';END get_authentication_name;
- 在系统 2 上运行
ssonete.sql 命令,配置 Login Server 以外部模式进行操作并为 Access Manager 加载新的外部身份验证实现(在步骤 1 中已保存到 ssoxnete.pkb 中)。
脚本 ssonete.sql 位于目录 $ORACLE_HOME/portal30/admin/plsql/sso 中。 作为用户 portal30_sso 运行该命令。
- 重新启动 Login Server 以使更改生效。
- 在安装了 Oracle 9iAS R1 的系统 2 上安装 Access Manager Policy Agent 2.1 for Apache Web Server 1.3.29。请按照随该代理一起提供的安装说明进行安装。确保在安装过程选中 SSL Ready 复选框。此外,即使该代理和 Access Manager 在同一域中,也启用 Cross Domain Single Sign-On (CDSSO)。
此步骤将代理模块安装到 Login Server 的同一实例中。
- 通过修改
AMAgent.properties 文件中的属性来配置代理,如下所示:
fetchHeaders -- 设置此值为 true,从而可以将其他策略响应属性引入 HTTP 头:
com.sun.am.policy.am.fetchHeaders=true
headerAttributes -- 此值表示要添加到 HTTP 头中的策略属性(如果 fetchHeaders 为 true)。设置此值为 uid|identity-user 以将 Access Manager 用户 ID 传送给 Login Server:
com.sun.am.policy.am.headerAttributes=uid|identity-user
do_sso_only -- 设置此值为 true,以便代理实施 SSO 用户身份验证,同时忽略身份验证政策。在此集成中,Login Server 处理身份验证:
com.sun.am.policy.agents.do_sso_only = true
fqdnDefault -- 此值由代理安装程序设置为代理所安装在的计算机的名称。确保此值为下列格式的完全合格域名(fully qualified domain name,FQDN):hostname.domainname。
例如,如果计算机称为 agent1,而域名为 sun.com,则设置 fqdnDefault 如下所示:
com.sun.am.policy.agents.fqdnMap = agent1.sun.com
fqdnMap -- 安装代理后,设置此值为 hostname | hostname,其中 hostname 不是 FQDN,而是代理所安装在的计算机的名称。
例如,如果计算机称为 agent1,系统的 FQDN 为 agent1.sun.com,则设置 fqdnMap 如下所示:
com.sun.am.policy.agents.fqdnMap = agent1 | agent1
cdsso-enabled -- 如果安装了代理且启用了 CDSSO,代理会自动设置此值。否则,要使 SSO 在 Oracle 环境中正常运行,请添加和启用此属性,如下所示:
com.sun.am.policy.agents.cdsso-enabled = true
cdcservletURL -- 如果安装了代理且启用了 CDSSO,代理会自动设置此值。否则,要使 SSO 在 Oracle 环境中正常运行,请根据此语法添加和启用此值:
http://FQDN hostname:portnumber/amserver/cdcservlet
其中 FQDN hostname 是安装了 Access Manager 的计算机的 FQDN,portnumber 是 amserver 进程的端口号。
例如,如果 Access Manager 安装在计算机 agent2.sun.com 上,侦听端口 58080,则设置此属性的值如下所示(都在一行中):
com.sun.am.policy.agents.cdcservletURL = http://agent2.sun.com:58080/amserver/cdcservlet
reverse_the_meaning_of_notenforcedList -- 设置此值为 true 以使 notenforcedList 为实施列表:
com.sun.am.policy.agents.reverse_the_meaning_of_notenforcedList = true
notenforcedList -- 当用 Oracle Portal Server 3.0.9 来测试 SSO 集成时,必须设置此值为 Login Server 和 Oracle Portal Server 3.0.9 的登录页面,如下所示(每个 URL 实例一行,以 http:// 开头):
http://hostname:portnumber/pls/portal30_sso/ PORTAL30_SSO.wwsec_app_priv.login?p_requested_url=http%3A%2F%2Fhos tname%3Aportnumber%2Fpls%2Fportal30_sso%2FPORTAL30_SSO.home&p_cancel _url=http%3A%2F%2Fhostname%3Aportnumber%2Fpls%2Fportal30_sso%2FPORTAL 30_SSO.home
http://hostname:portnumber/pls/portal30/ PORTAL30.wwsec_app_priv.login?p_requested_url=http%3A%2F%2Fhostname
%3Aportnumber%2Fpls%2Fportal30%2FPORTAL30.home&p_cancel_url=http%3A %2F%2Fhostname%3Aportnumber%2Fpls%2Fportal30%2FPORTAL30.home
其中 hostname 是代理所安装在的计算机的名称,portnumber 是 Oracle HTTP Server 侦听的端口号。
例如,如果 hostname 为 agent1,portnumber 为 7779,则如下设置此值:
com.sun.am.policy.agents.notenforcedList = http://agent1:7779/ pls/portal30_sso/ PORTAL30_SSO.wwsec_app_priv.login?p_requested_url=http%3A%2F%2Fa gent1%3A7779%2Fpls%2Fportal30_sso%2FPORTAL30_SSO.home&p_cancel_u rl=http%3A%2F%2Fagent1%3A7779%2Fpls%2Fportal30_sso%2FPORTAL30_SS O.home http://agent1:7779/pls/portal30/ PORTAL30.wwsec_app_priv.login?p_requested_url=http%3A%2F%2Fagent 1%3A7779%2Fpls%2Fportal30%2FPORTAL30.home&p_cancel_url=http%3A%2 F%2Fagent1%3A7779%2Fpls%2Fportal30%2FPORTAL30.home
注意:如果使用了其他 Oracle 合作伙伴应用程序,也要将它们的登录 URL 添加到列表中。
logout.url -- 此值指定 Login Server 和合作伙伴应用程序的注销 URL。代理永远不实施这些 URL。相反,当代理发现它们中的任何一个时,它会检查用户是否仍存在有效的会话 ID。如果存在,代理会使其失效,有效地将用户从 Access Manager 中注销。然后,代理将请求传送给 Login Server 进行注销处理。
因为 Oracle Portal Server 是进行验证的合作伙伴应用程序,所以 Login Server 和 Oracle Portal Server 3.0.9 的注销页面的 URL 都包含在此集成中。URL 仅由空格分隔。语法如下所示:
com.sun.am.policy.agents.logout.url = http://hostname:portnumber/pls/ portal30_sso/ PORTAL30_SSO.wwsec_app_priv.logout?p_done_url=http%3A%2F%2Fhostname
%3Aportnumber%2Fpls%2Fportal30_sso%2FPORTAL30_SSO.home http:// hostname:portnumber/pls/portal30/ PORTAL30.wwsec_app_priv.logout?p_done_url=http%3A%2F%2Fhostname%3Ap ortnumber%2Fpls%2Fportal30%2FPORTAL30.home
其中 hostname 是代理所安装在的计算机的名称,portnumber 是 Oracle HTTP Server 侦听的端口号。
注意 - 确保使用空格分隔 URL。
例如,如果 hostname 为 agent1,portnumber 为 7779,则如下设置此值:
com.sun.am.policy.agents.logout.url = http://agent1:7779/pls/ portal30_sso/ PORTAL30_SSO.wwsec_app_priv.logout?p_done_url=http%3A%2F%2Fagent 1%3A7779%2Fpls%2Fportal30_sso%2FPORTAL30_SSO.home http://agent1:7779/pls/portal30/ PORTAL30.wwsec_app_priv.logout?p_done_url=http%3A%2F%2Fagent1%3A 7779%2Fpls%2Fportal30%2FPORTAL30.home
注意:如果使用了其他 Oracle 合作伙伴应用程序,请将它们的注销页面的 URL 添加到此列表中。
logout.cookie_reset_list -- 此值列出当用户从 Login Server 中注销时必须重置或删除的 cookie。因为使用 Oracle Portal Server 3.0.9 测试集成,所以必须将 Login Server 和 Oracle Portal Server 的 cookie 都添加到此列表中,如下所示(都在一行中):
com.sun.am.policy.agents.logout.cookie_reset_list = Domain=, iPlanetDirectoryPro, iPlanetDirectoryPro;Domain=, portal30,portal30;Domain=
注意:如果使用了其他 Oracle 合作伙伴应用程序,请将那些应用程序的 cookie 添加到此列表中。那样,当用户从 Login Server 中注销时,Access Manager 就可以重置或删除这些 cookie。
- 编辑系统 2 上 Oracle 9iAS
的 modplsql 数据库访问描述符(Database Access Descriptor,DAD)文件(称为 wdbsvr.app,位于目录 $ORACLE_HOME/Apache/modplsql/cfg 中)。在 DAD_portal30 和 DAD_portal30_sso 区下添加下列条目:
- Access Manager 头:
cgi_env_list = HTTP_IDENTITY_USER
- Login Server 模式的连接字符串:
connect_string = FQDN:database_listener_portnumber:Oracle_SID
集成的验证
接着,使用 Oracle Portal Server 测试 SSO 集成。按照下列步骤进行:
- 重新启动 Access Manager。
有关详细信息,请参见 Chapter 10 in the Access Manager Administration Guide。
- 重新启动 Login Server,确保所有 Oracle 和代理更改都已生效。
确保作为 Oracle 用户而不是 root 用户重新启动 Login Server。否则,会有意想不到的情况发生。
- 通过登录到 Login Server 或 Oracle Portal Server 测试集成。
如果集成起作用,您将被定向到 Access Manager 登录页面。成功进行身份验证后,您将可以访问 Oracle 应用程序。
问题排解提示
如果集成失败,从 Login Server 和 Access Manager Policy Agent 2.1 for Apache Web Server 1.3.29 的日志文件中查找调试线索,或者从 Accee Manager 的日志文件中查找。
如果怀疑代理和 Access Manager 之间的通信有问题,用默认的代理配置文件代替自定义的代理配置文件(默认文件保护受保护端口上的所有元素)。然后就可以验证端口是否在工作。
参考资料
关于作者
Jennifer Glore、Prashant Srinivasan 和 Alice Wang 是 Sun Market Development Engineering group 的技术人员。Jennifer 和 Prashant 在 Oracle 工作以将其产品与 Sun Java System Access Manager 进行集成。Alice 则主要负责将来自独立软件开发商的应用程序与 Sun 的身份管理产品进行集成。
Marina Sum 是 Sun Developer Network 的专职撰稿人。她已经为 Sun 进行了 15 年的撰写工作,主要是在技术领域。 |