SSO单点登录的实现

1、为什么要做SSO?

在猎豹移动游戏开放平台刚开始的时候,我们的首要需求是实现OAuth2协议来为CP提供接入功能。
但随着我们的项目在发展,论坛、客服、用户中心也进行开发以及展望,不同的系统之间,帐号需要互通,实现单点登录,因此SSO应运而生。
也许有人说OAuth2也能实现单点登录,为什么不直接所有的系统都通过OAuth协议来实现统一登录。
对于大型的平台,SSO单点登录是必须的。OAuth给用户资源的授权提供了一个安全的、开放而又简易的标准,能够更安全、更方便的给第三方提供某些用户授权的信息。但和OAuth不同的是,对于我们自己的系统来说,不需要进行授权就能让用户进行使用。
一个很好的例子就是腾讯的QQ登录功能,对于第三方例如京东,就是使用OAuth协议进行授权,而对于腾讯微博、QQ空间,则是通过SSO来实现单点登录。

 

2、如何实现SSO?

SSO有以下几种方式实现:

  • 共享Cookie,这种是我们最先采取的方式。当我们的子系统都在一个父级域名下时,我们可以将Cookie种在父域下,这样浏览器同域名下的Cookie则可以共享,这样可以通过Cookie加解密的算法获取用户SessionID,从而实现SSO。
    但是,后面我们发现这种方式有几种弊端:
    a. 所有同域名的系统都能获取SessionID,易被修改且不安全;
    b. 跨域无法使用。
    所以到后面抛弃这种做法。
  • Ticket验证,我们目前采取的是这种方式。这种实现的SSO有以下几个步骤:
    a. 用户访问某个子系统,发现如果未登录,则引导用户跳转到SSO登录页面;
    b. 判断SSO是否已经登录;
    c. 如果已经登录,直接跳转到回调地址,并返回认证ticket;
    d. 如果未登录,用户正确输入用户名/密码,认证通过跳转到回调地址,并返回认证ticket;
    e. 子系统获取ticket,调用SSO获取用户uid等信息,成功后让用户登录。

Continue reading

使用 Sun Java System Access Manager 和 SAML 实现 SSO

原文:http://www.sun.com/bigadmin/hubs/multilingual/simp_chinese/content/sso.jsp

通过使用企业内的单点登录 (Single Sign-On, SSO),用户仅登录一次即可访问该企业的所有应用程序。SSO 实现需要以下内容:

  • 身份认证提供者 (Identity Provider, IdP),用于验证用户
  • 服务提供者 (Service Provider, SP),用于使用 IdP 检查验证状态,并确保为经过验证的用户授予执行相关任务的权限

IdP 和 SP 之间的验证和授权数据交换是通过一个名为安全声明标记语言 (Security Assertion Markup Language, SAML) 的 XML 标准实现的,此标准由结构化信息标准促进组织 (Organization for the Advancement of Structured Information Standards, OASIS) 的安全服务技术委员会制订。

Sun Java System Access Manager 支持 SAML 规范的所有版本,包括最新的 2.0 版,用以实现验证和授权交换。有关 Sun Java System Access Manager 的详细信息,请参见其文档

本文介绍了基本 SAML 概念,并说明了使用 Sun Java System Access Manager 7.1(以后简称 Access Manager)和 SAML 1.x Web 浏览器工件配置文件(在下面定义)实现 SSO 的步骤。此处,IdP 是 Access Manager;SP 是 SAP NetWeaver Enterprise Portal 2004(以后简称 SAP EP),它部署在 SAP NetWeaver Application Server Java (SAP J2EE Engine) 上。

目录

 
基本 SAML 概念
过程流
配置 Access Manager
配置 SAP NetWeaver Application Server
测试 SSO
参考资料

 

SAML 包含两个重要概念:

  • 声明,它声明了一些事实,这些事实包含有关主体(用户)的验证、授权或属性的信息。
  • 配置文件,它是一组规则,用于定义如何嵌入和提取声明。配置文件说明了授权机构如何将声明与其他对象组合在一起、如何从授权机构传输声明以及随后如何在可信业务伙伴站点对其进行处理。

    SAML 定义了以下两个配置文件:

    • Web 浏览器工件配置文件,它包含一个指针,指向到 SP 的 HTTP 重定向的查询字符串中的 SAML 声明(称为工件),通常为参数 SAMLart。然后,SP 向 IdP 和工件发出直接 SOAP/HTTP 请求,从而获取响应中的实际 SAML 声明SAP J2EE Engine 实现此配置文件。
    • Web 浏览器 POST 配置文件,它在 IdP 发送到 SP 的响应(作为 HTML 表单的一部分)中包含 SAML 声明。

      两个配置文件随 IdP 和 SP(本文中的 Access Manager 和 SAP J2EE Engine)之间交换声明的方式而有所不同。

SSO 的验证和授权过程如下所示:

  1. 用户通过 Access Manager 访问应用程序(如 SAP EP),此应用程序是为 SAML 验证配置的,并部署在 SAP J2EE Engine 上。
  2. 如果尚未进行验证,Access Manager 将对用户进行验证。
  3. Access Manager 为用户创建并存储验证声明。
  4. Access Manager 调用注册的插件,其中包括 Name Identifier Mapper。Name Identifier Mapper 将经过验证的用户映射到验证声明中的用户名称标识符,并使用映射的标识符对其进行更新。
  5. Access Manager 为声明创建一个工件,并为在 SAP J2EE Engine 中注册的 SAML 接收方发出 HTTP 重定向。
  6. 浏览器将用户重定向到 SAP J2EE Engine 上的 SAML 接收方服务。
  7. SAP J2EE Engine 上的 SAML 接收方将请求和工件转发到 SAP EP,后者配置了 SAML 登录模块。接下来,该登录模块评估工件,然后根据工件获取 IdP (Access Manager) 的主机名和端口号。
  8. SAP J2EE Engine 上的 SAML 登录模块生成一个包含工件的声明请求,并将该请求作为简单对象访问协议 (Simple Object Access Protocol, SOAP)/HTTP 消息发送到 Access Manager 的 SAML SOAP 接收方。
  9. Access Manager 根据声明请求中的工件来获取相应的声明。
  10. Access Manager 将声明返回到 SAML 登录模块。
  11. 该模块分析声明并对用户进行验证。
  12. 在经过验证后,用户即可通过 SSO 访问 SAP EP。

图 1 说明了过程流。

图 1:过程流

 

本部分介绍如何将 Access Manager 配置为与 SAP J2EE Engine 配合使用。

为 SAP J2EE Engine 创建站点 ID
首先,为 SAP J2EE Engine 创建站点 ID:

  1. 在运行 Access Manager 的计算机上解压缩此 ZIP 文件
  2. amgenSiteId 脚本中的 AM_HOME 指向正确的目录。

    注:仅当在非缺省位置 (/opt) 中安装 Access Manager 时,才需要执行此步骤。

  3. amgenSiteId 授予执行权限。
  4. 使用 amgenSiteId 命令为 SAP J2EE Engine 生成站点 ID。例如,键入:

    % amgenSiteId http://ephost.companyxyz.com:50100

    注:请确保 URL 包含末尾斜杠 (/)。

要点:保存 ID 记录以备将来使用。

配置 Java 虚拟机的类路径
接下来,将 sap_saml_sso.jar 文件添加到部署了 Access Manager 的 Web 容器的 Java 虚拟机类路径中。通常,您在 Web 容器的管理控制台中执行此任务。有关详细信息,请参见相关文档。

确保重新启动 Web 容器以使更改生效。

获取 Access Manager 的站点 ID
现在,获取 Access Manager 的唯一站点 ID:

  1. amAdmin 身份登录到 Access Manager。
  2. 单击 Federation(联合)选项卡,然后单击 SAML 选项卡。
  3. 在 Site Identifiers(站点标识符)下面,单击 Instance ID(实例 ID)下第一个条目的链接。

    将显示 Edit Site Identifier(编辑站点标识符)页,其中包含站点 ID 以及其他相关信息。请参见图 2。

  4. 将站点 ID(在图 2 中突出显示)保存在临时文件中以备将来使用。

图 2:Edit Site Identifier(编辑站点标识符)页

 

将 SAP J2EE Engine 注册为可信业务伙伴
接下来,在 Access Manager 中将 SAP J2EE Engine 注册为可信合作伙伴:

  1. 在 Edit Site Identifier(编辑站点标识符)页上单击 Back to SAML(返回到 SAML)。

    将显示用于在 Access Manager 中配置 SAML 的主页。

  2. 单击 Trusted Partners(可信合作伙伴)下的 New(新建)。

    将显示 Select trusted partner type and profile(选择可信合作伙伴类型和配置文件)向导。

  3. 选择 Destination(目标)下的 Artifact(工件),并取消选中所有其他选项。单击 Next(下一步)。

    将显示 Add New Trusted Partner(添加新的可信合作伙伴)页。

  4. 指定下面所示的值,然后单击 Finish(完成)。

    Source ID(源 ID)
    SAP J2EE Engine 的站点 ID
    Host List(主机列表)
    运行 SAP J2EE Engine 的计算机的 IP 地址。
    Target(目标)
    运行 SAP J2EE Engine 的计算机的全限定名称。
    SAML URL
    SAP J2EE Engine 上的 SAML 接收方的 URL,通常采用 http://SAP_J2EE_host.domainname:portnumber/saml/receiver 形式。在某些情况下,http 可能为 https
    Name Identifier Mapper
    com.sun.identity.saml.plugins.UidMapper

     

  5. 单击 Save(保存)。

    Access Manager 将确认这些设置。请参见图 3。

    图 3:将 SAP J2EE Engineer 作为 Access Manager 中的可信合作伙伴

     

  6. 验证用于在 Access Manager 中配置 SAML 的主页中的 Trusted Partners(可信合作伙伴)下面现在是否显示 SAP J2EE Engine 条目。

下面是背后隐含的逻辑:Java 类 UidMapper 实现 NameIdentifierMapper 接口,其方法 getNameIdentifier 返回 SAML 声明中 NameIdentifier 组件的值。实际上,UidMapper 从 Access Manager 令牌中检索经过验证的用户数据,并将其映射到用户的登录 ID。这样,该 ID 便与 Access Manager 发送到 SAP J2EE Engine 的 SAML 声明中的 NameIdentifier 组件相匹配。

在 SAP J2EE Engine 中创建用户
为简便起见,本文中的示例使用简单用户映射,因此,SAP J2EE Engine 中的每个用户在 Access Manager 中都有一个具有相同登录 ID 的用户条目。但是,SSO 并要求使用简单用户映射。可通过自定义帐户映射、名称标识符映射以及属性映射来实现不同的映射。有关详细信息,请参见《Sun Java System Access Manager 7.1 Federation and SAML Administration Guide》(Sun Java System Access Manager 7.1 联合和 SAML 管理指南)的第 10 章

Sun Java System Identity Manager 允许以集中、自动和批量方式向来自多个供应商的应用程序置备用户、角色和其他信息,其中包括 SAP EP、SAP R/3 和 SAP HR。有关详细信息,请参见 Sun Java System Identity Manager 文档

作为一个测试,请按照《Sun Java System Access Manager 7.1 Administration Guide》(Sun Java System Access Manager 7.1 管理指南)第 6 章中的过程在 Access Manager 中创建用户。

本部分介绍如何为 SAML 验证配置 SAP NetWeaver Application Server。

更改 SAML 服务的启动模式
首先,确保在启动 SAP J2EE Engine 时始终启动 SAML 服务:

  1. 启动 SAP J2EE Visual Administrator。
  2. 登录到 SAP Visual Administrator。
  3. 在左窗格的树视图中,展开 Server 0(服务器 0)> Services(服务)> Configuration Adapter(配置适配器)。
  4. 在右窗格的树视图中,展开 Configurations(配置)> cluster_data > server(服务器)> cfg > services(服务)。
  5. 单击带有铅笔图标的按钮以切换到编辑模式。在 SAP Visual Administrator 提示您确认时,单击 Yes(是)。
  6. 在右窗格中,向下滚动并双击 "Propertysheet tc~sec~saml~service-runtime"。

    将显示 Change Configuration(更改配置)对话框。

  7. 单击第二行 startup-mode。

    将显示 "Change property entry"(更改属性条目)对话框。请参见图 4。

    图 4:更改 SAML 服务的启动模式

     

  8. 在 Custom(自定义)字段中键入 always,然后单击 "Apply custom"(应用自定义)。

    在随后显示的 "Display configuration"(显示配置)对话框中将显示这些设置。

  9. 单击 OK(确定)。

为 SAML SOAP 接收方创建目标
接下来,在 Access Manager 中为 SAML SOAP 接收方创建一个 HTTP 目标:

  1. 在 SAP Visual Administrator 左窗格中单击 Cluster(群集)选项卡,然后展开 Server 0(服务器 0)> Services(服务)> Destinations(目标)。
  2. 在右窗格中单击 Runtime(运行时)选项卡,然后展开 Destinations(目标)> HTTP。
  3. 单击 New(新建)按钮,然后在文本字段中键入新目标的名称,例如 SunAM。单击 OK(确定)。
  4. 在 Connection Settings(连接设置)下面,在 URL 文本字段中键入 Access Manager 的 SAML SOAP 接收方 URL,例如 http://ephost.companyxyz.com:8080/amserver/SAMLSOAPReceiver

    此处作为一个测试,请使用没有客户端验证的不安全通道,即 Authentication(验证)下面的设置为 None(无)。在生产环境中,应指定具有客户端验证(如 BASIC、SSL 等)的安全通道。

  5. 单击 Save(保存)。请参见图 5。

    图 5:Access Manager 的 SAML SOAP 接收方的目标

     

配置 SAML 服务
现在,在 SAP J2EE Engine 上配置 SAML 服务:

  1. 在 SAP Visual Administrator 左窗格中单击 Cluster(群集)选项卡,然后展开 Server 0(服务器 0)> Services(服务)> Configuration Adapter(配置适配器)。
  2. 在右窗格中单击 Runtime(运行时)选项卡,然后向下滚动。展开 SAML > Configuration(配置)> PartnersInbound。
  3. 单击带有铅笔图标的按钮以切换到编辑模式。在 SAP Visual Administrator 提示您确认时,单击 Yes(是)。
  4. 右键单击 PartnersInbound 节点,然后从上下文菜单中选择 Create Sub Node(创建子节点)。
  5. 在文本字段中键入合作伙伴的名称,例如 SunAM。单击 Create(创建)。
  6. 展开新创建的节点,并指定下面所示的值:
    • Destination Name(目标名称):键入在上一部分中创建的目标的名称。
    • SourceID(源 ID):键入在上一部分中获取的 Access Manager 站点 ID。该 ID 以 B64 开头,例如 B64:Gz5Ie6oAgITQsmjxfsDyru/jtiM=
  7. 作为一个测试,请将 Configurations(配置)> saml > Configuration(配置)> Settings(设置)下的 PermitInsecureConnections 参数设置为 true。请参见图 6。

    图 6:SAML 服务参数

     
    注:在生产环境中,请将 PermitInsecureConnections 设置为 false

将 SAML 登录模块添加到应用程序的登录模块栈中
接下来,将 SAML 登录模块添加到应用程序的登录模块栈中,如下所示。在本示例中,将修改 SAP EP 所使用的 ticket 模板。

  1. 在 SAP Visual Administrator 左窗格中单击 Cluster(群集)选项卡,然后展开 Server 0(服务器 0)> Services(服务)> Security Provider(安全提供者)。
  2. 单击 Policy Configuration(策略配置)选项卡,然后在 Components(组件)窗格中选择 ticket
  3. 单击带有铅笔图标的按钮以切换到编辑模式。在 SAP Visual Administrator 提示您确认时,单击 Yes(是)。
  4. 在右窗格中单击 Modify(修改)并调整登录模块栈,以使其如图 7 所示。然后,关闭 SAP Visual Administrator。

    图 7:将 SAML 登录模块添加到登录模块栈中

     

  5. 重新启动 SAP J2EE Engine。

最后,在 SAP EP 中使用 SAML 声明测试 SSO 模式:

  1. 转到 SAP EP 的 SSO 触发器,例如 http://ephost.companyxyz.com:8080/amserver/SAMLAwareServlet?TA RGET=http://ephost.companyxyz.com:50100/irj/portal

    SAP EP 将提示您在 Access Manager 中进行验证。

  2. 以在上一部分中创建的某个用户身份登录(例如,Administrator)。

    SAP EP 将显示欢迎页面。请参见图 8。

    图 8:SAP EP 欢迎页面