如何使用 SAML v2 设置 SSO

Red Hat JBoss Enterprise Application Platform 7.3

使用 SAML 2.0 配置和管理红帽 JBoss 企业应用平台的单点登录用户访问的说明。

摘要

本指南旨在深入探讨使用 SAML v2 的单点登录是什么,以及如何在红帽 JBoss 企业应用平台(JBoss EAP)中设置和配置它。在阅读本指南之前,用户应通读 JBoss EAP 安全架构指南,对本指南中介绍的单点登录和 SAML v2 信息有扎实的理解。完成本指南时,您应该对单点登录和 SAML v2 有了扎实的工作了解、它如何与 JBoss EAP 关联以及如何进行配置。

第 1 章 使用 SAML v2 Deeper Dive 单点登录

JBoss EAP 安全架构指南 介绍了单点登录和 SAML 的基础知识。本节深入探讨 SAML v2 和 Single Sign-On 中涉及的组件。

1.1. 什么是 SAML v2?

安全断言标记语言(即 SAML)是一种数据格式和协议,允许双方(通常是身份提供程序和服务提供商)交换身份验证和授权信息。此信息以 SAML 令牌的形式交换,包含断言,由身份提供程序发布到用于向服务提供商进行身份验证的主题。通过多个服务提供商使用和重用来自身份提供程序的 SAML 令牌的功能允许 SAML v2 帮助基于浏览器的单点登录。

1.1.1. 构建块

对于 SAML,需要记住最重要的概念就是,它完全涉及到在实体之间传递安全断言。SAML 具有多个组件来完成此任务。

1.1.1.1. 实体

实体是参与创建和传递断言的所有方。SAML 的概念有三种不同的实体:

主题
主体 也称为 主体,在大多数情况下,用户是用户,请求访问由 SAML 保护的服务提供商 上的资源。
服务提供商
服务提供商 (或 SP )要求作为断言来证明该 对象 的身份需要来自 身份提供程序
身份供应商
身份提供商IDP 提供一组声明,格式 为主题的 令牌,供 服务提供商 用于身份验证和授权决策。

总之,主体 会获得发布的断言、身份提供程序发出 这些断言,服务提供商 使用这些断言来验证和授权 对象

1.1.1.2. 安全保证

安全断言是身份提供程序就某一主题发布的一组声明。服务提供商使用这些断言对主题做出 access-control 决策。声明可采用以下形式:

身份验证
身份验证 断言声称对象在特定时间点上使用指定方法成功验证身份。也可以在身份验证语句中指定包含已验证对象的其他信息的身份验证上下文。
属性
属性 断言声称主题具有某些属性。
授权决策
授权决策 断言将对资源上的主题的授权请求做出响应 或拒绝

示例

This user logged in as Sarah at 9:30 using a username and password.  Sarah is a member of the Managers group.  Sarah is accepted to access the Employee Information resource.

  • 此用户声明 此用户使用用户名和密码在 9:30 中以 Sarah 身份登录,即验证 断言。
  • Sarah 是 Managers 组的成员, 是一个 属性 断言。
  • Sarah 被接受以访问 Employee Information 资源,这是 授权决策 断言。

断言被打包为 SAML 令牌,并使用 SAML 协议传输。

1.1.1.3. 协议

SAML 协议描述了如何打包断言(通常采用请求和响应的形式),以及正确处理它们的规则。这些规则必须跟随请求者和响应的生产者和消费者。请求可以请求特定、已知的断言或查询身份提供商进行身份验证、属性或授权决策。请求和响应消息(包括安全断言)采用 XML 格式,并遵循指定的架构。

1.1.1.4. 绑定

SAML 绑定指定 SAML 协议如何映射到用于传输和消息传递的其他标准协议。一些示例包括:

  • 映射到 HTTP 重定向的 SAML 绑定。
  • 映射到 HTTP POST 的 SAML 绑定。
  • 将 SAML 请求/响应映射到 SOAP 请求和响应的 SAML 绑定。

1.1.1.5. profiles

SAML 配置集使用断言、协议和绑定来支持特定用例,如 Web 浏览器单点登录、单点注销和 Assertion 查询。

1.2. 如何使用单点登录进行 SAML v2 工作

JBoss EAP 安全架构指南介绍了基于浏览器的单点登录 (使用 SAML 和多个红帽 JBoss 企业应用平台实例)以及多个基于浏览器的单点登录指南,以及使用基于浏览器的单点登录和 SAML 部分的多应用程序。本节更加深入地阐述 SAML 配置集和与基于浏览器的单点登录与 SAML v2 相关的绑定。

1.2.1. Web 浏览器单点登录配置文件

Web 浏览器单点登录 配置文件以浏览器代理的形式指定 IDP、SP 和主体,处理基于浏览器的单点登录。SP 和 IDP 都具有多个绑定,每个绑定都可以在 Web 浏览器单点登录配置文件中使用,从而允许许多可能的流。另外,这个配置集还支持从 IDP 或 SP 启动的消息流。此配置集还支持 IDP 将 SAML 断言推送到 SP 或从 IDP 中拉取断言的 SP。从 SP 或 IDP 开始的流程将在 JBoss EAP 安全架构指南 的高级别加以说明。从 IDP 推送的 SAML 断言利用 HTTP POST 消息或 HTTP 重定向。由 SP 拉取的 SAML 断言涉及将工件发送到接收方,然后被解引用来获取断言。

Web 浏览器单点登录配置集的基本流如下:

  1. 对 SP 的主要 HTTP 请求.

    主体首先尝试使用 HTTP 用户代理(如浏览器)在 SP 访问受保护的资源。如果主体已签发了具有有效安全性上下文的 SAML 令牌,SP 将允许或拒绝主体。这是最后一步。否则,SP 将尝试查找用于身份验证请求的 IDP。

  2. SP 确定 IDP.

    SP 查找支持 SP 的首选绑定的 IDP 及其端点。这允许 SP 向 IDP 发送身份验证请求。此过程的具体方式可能因实施而异。

  3. 使用主体从 SP 向 IDP 发出身份验证请求.

    SP 确定 IDP 位置和端点后,SP 以 <AuthnRequest> 消息的形式发出身份验证请求,该消息将由用户代理向 IDP 主体发送。HTTP 重定向、HTTP POST 或 HTTP 工件 SAML 绑定可用于使用用户代理将消息传输到 IDP。

  4. IDP 标识主体.

    身份验证请求通过主体发送到 IDP 后,主体将由 IDP 标识。识别方法不是通过 Web 浏览器单点配置文件具体定义,可以通过多种方式完成,例如使用 FORM 进行身份验证,使用现有的 会话信息、kerberos 身份验证等。

  5. IDP 问题响应 SP.

    确定了主体后,IDP 以 <Response> 信息的形式发出一个响应,以返回 SP,以便使用用户代理授予或拒绝主体访问。此消息将至少包含一个身份验证断言,也可用于指示错误。HTTP POST 或 HTTP 工件可用于传输此消息,但由于大多数用户代理的 URL 长度限制而无法使用 HTTP 重定向。如果用户代理发起基于 IDP 的流(例如,尝试直接访问 IDP 而不是 SP),则此过程从这一步开始。如果成功,HTTP POST 或 HTTP Artifact 将发送到一个位置,该位置在 IDP 中预先配置。

  6. SP 允许或拒绝访问主体.

    SP 收到 Response 后,可以通过创建安全上下文或拒绝访问或执行自己的错误处理,向主体授予所请求资源的访问权限。

注意

JBoss EAP 不支持 SAML 工件绑定。

HTTP 重定向与.POST Bindings

HTTP 重定向绑定利用 HTTP GET 请求 和 URL 查询参数来传输协议消息。以这种方式发送的消息也在接收方发送和解码前 URL 和 Base-64 编码。HTTP POST 绑定使用表单数据发送消息,并在消息上执行 base-64 编码/decode。SP 和 IDP 都可以使用重定向或 POST 绑定来传输和接收消息。由于某些情况下 URL 长度的限制,通常在传递短消息时使用 HTTP 重定向,并在传递较长的消息时使用 HTTP POST

1.2.2. 全局注销配置集

Global Logout Profile 允许一个通过一组 I/P 和 SP 进行身份验证的主体注销,并将该断言传播到一个或多个关联的 Is 和 SP。

当主体通过 IDP 验证时,主体和 IDP 建立了身份验证会话。然后,IDP 根据该身份验证向各个 SP 或依赖方发出断言。如果主体试图访问那些 SP 中的安全资源,SP 可以根据 IDP 发布的该断言(从而依赖于 IDP)与主体建立额外的会话。

旦创建了某一会话或一组会话,则一个主体可能会通过不同的方式单独注销会话,也可以使用全局注销配置文件注销所有会话、所有 SP 和 IDP。Global Logout Profile 可以在其流中使用 HTTP 重定向、HTTP POST 或 HTTP Artifact 绑定。在某些情况下,它还可以使用 SOAP 绑定,这些情况并不属于本文档的范围。

注意

单注销配置文件可用作全局注销配置文件的代号。

注意

JBoss EAP 不支持 SAML 工件绑定。

与 Web 浏览器单点登录配置文件流一样,Global Logout Profile 流可以在 IDP 或 SP 上启动。

Global Logout Profile 的基本流程如下:

  1. 由会话参与者发布到 IDP 的注销.

    会议参与者,如服务提供商或其他依赖方,终止其自身与主体的会话,并以 <LogoutRequest> 信息的形式向 IDP 发送一个最初为主体发布安全断言的 IDP。此请求可以直接在 IDP 和依赖方之间发送,或者通过使用主体的用户代理作为传递间接发送。

  2. IDP 标识会话参与者.

    旦 IDP 收到注销请求,它将使用该请求来确定哪些会话要终止依赖方,包括作为会话授权或会话参与者 IDP 拥有的任何会话。对于每个会话,IDP 向依赖方发出注销请求,并等待来自双方的注销响应,然后再向原始会话参与者发出新的注销响应。如果在 IDP 上启动全局 Logout Profile 流,则流程从此步骤开始,其他一些机制则用于确定会话和 SP。

  3. IDP 发布的注销.

    在 IDP 确定所有会话和相关的依赖方后,它会以 <LogoutRequest> 信息的形式向每个依赖方发送 Logout 请求,并等待 Logout Response。这些请求可以在 IDP 和依赖方之间直接发送,或者间接通过主体的用户代理发送。

  4. 注销会议参与者或授权机构发出的回复.

    每个依赖方(包括 IDP 本身)会尝试根据 Logout Request 中的 IDP 指示终止会话,并以 <LogoutResponse> 消息的形式返回 Logout Response,返回 IDP。与注销请求一样,可以将响应直接在依赖方和 IDP 之间发出,或者间接通过主体的用户代理发出。

  5. IDP 发布对原始会话参与者的注销响应.

    从依赖方收到所有注销响应后,IDP 会以 <LogoutResponse> 信息的形式发送一个新的注销响应,返回请求注销的原始会话参与者。如同此流程的其他部分一样,此响应可直接在 IDP 和会话参与者之间传递,或者间接通过主体的用户代理进行传递。如果在 IDP 上发起 Logout Request,则省略这一步。

注意

JBoss EAP 不支持在 JBoss EAP 中支持 IDP 和 SP 部分的全球注销配置文件之间的直接通信。

1.2.3. 多个 IDP 和 Identity Discovery Profile

使用 SAML v2 基于浏览器的单点登录也支持有多个 IDP,并可用于 Web 浏览器单点登录配置文件和全局注销配置集。如果配置了多个 IDP,则会使用 Identity Discovery SAML 配置集来确定主体使用的 IDP。这可以通过读取和写入带有域信息和 IDP 列表的 Cookie 来实现。

1.3. 深入阅读

有关 SAML v2 的详情,请查看官方 SAML 2.0 规格

第 2 章 如何使用 SAML v2 设置 SSO

重要

使用 Picketlink 使用 SAML v2 设置单点登录已弃用。现在,您必须使用 Red Hat Single Sign-On 产品页面上的产品文档,该页面支持 OAuth 和 OpenID Connect 以及 SAML。

如果要在受支持的协议上将单点登录用于红帽单点登录,如 OIDC 或 SAML v2,同时在 JBoss EAP 上保护应用程序,请参阅安全应用程序和服务指南

本节详细介绍了使用 JBoss EAP 使用 SAML v2 设置单点登录的步骤。

2.1. 组件

实体部分 以及 JBoss EAP 安全架构 指南 中所述,有三个 实体或 参与者都使用 SAML v2 参与基于浏览器的单点登录。

  • 使用用户代理(浏览器)请求对受保护资源的访问的主体。
  • 服务提供商拥有受保护的资源。
  • 向主体发出安全断言的身份提供商,允许它们访问服务提供商的安全资源。

此外,需要使用 SAML v2 支持基于浏览器的单点登录。

  • 单独 Web 应用程序充当 SP 和 IDP
  • 用于托管 SP 和 IPA 的 JBoss EAP 实例.
  • 用于支持 SP 和 IDP 的安全域.

2.2. IDP 和 SP 设置和配置

本节介绍将应用设置为 SP 或 IDP,以及设置 JBoss EAP 实例以托管这些应用。

2.2.1. 设置 IDP

要将应用程序设置为 IDP,必须执行以下步骤:

注意

在创建和部署应用之前,应创建和配置安全域。

  1. 为 IDP 创建安全域。

    IDP 处理为其凭证带来挑战的主体,处理该主体的验证和授权,并根据结果发出适当的 SAML v2 安全断言。这需要使用安全域配置身份存储。创建此安全域和身份存储的唯一要求是其已正确定义了身份验证和授权机制。这意味着,可以使用许多不同的身份存储 SAS-svc(如属性文件、数据库或 LDAP全部)及其关联的登录模块来支持 IDP 应用。有关安全域的更多信息,请参阅 JBoss EAP 安全架构指南中的安全 https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.3/html-single/security_architecture/#security_domains 域部分

    以下示例通过属性文件使用简单的 UsersRoles 登录模块。

    用于创建安全域的管理 CLI 命令

    /subsystem=security/security-domain=idp:add(cache-type=default)
    
    /subsystem=security/security-domain=idp/authentication=classic:add
    
    /subsystem=security/security-domain=idp/authentication=classic/login-module=UsersRoles:add(code=UsersRoles,flag=required,module-options=[usersProperties=${jboss.server.config.dir}/idp-users.properties,rolesProperties=${jboss.server.config.dir}/idp-roles.properties])
    
    reload

    UsersRoles login 模块利用属性文件来存储用户/密码和用户/角色信息。有关 UsersRoles 模块的更多信息,请参阅 JBoss EAP 登录模块参考。在本例中,属性文件包含以下内容:

    idp-users.properties

    Eric=samplePass
    Alan=samplePass

    idp-roles.properties

    Eric=All
    Alan=

  2. 为 IDP 配置 web.xml 文件。

    IDP 的 web.xml 文件必须包含以下内容:

    • 带有 < web-resource-collection> 的 <security-constraint >,其中包含一个 <url-pattern>,它映射到安全区域的 URL 模式。另外,<security-constraint> 也可以包含 <auth-constraint> 来 替代允许的角色。
    • 为 FORM 身份验证 配置 <login-config>
    • 如果在 <auth-constraint> 中指定了任何角色,则应在 <security-role> 中定义这些角色。
    • (可选)登录表单使用的资源(如映像和样式)可以通过不被保护的额外安全性约束来指定,以便在身份验证之前访问这些资源,例如在登录页面上。

    <security-constraint><security-role> 元素可让管理员根据 URL 模式和角色设置受限或不受限制的区域。这允许保护或不受保护的资源。

    <login-config> 标签定义 IDP 在验证用户时使用的登录和错误页面。

    web.xml 文件示例:

    <web-app>
      <display-name>IDP</display-name>
      <description>IDP</description>
      <!-- Define a security constraint that gives unlimited access to images -->
      <security-constraint>
        <web-resource-collection>
          <web-resource-name>Images</web-resource-name>
          <url-pattern>/images/*</url-pattern>
        </web-resource-collection>
      </security-constraint>
      <!-- Define a security constraint that requires the All role to access resources -->
      <security-constraint>
        <web-resource-collection>
          <web-resource-name>IDP</web-resource-name>
          <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
          <role-name>All</role-name>
        </auth-constraint>
      </security-constraint>
      <!-- Define the Login Configuration for this Application -->
      <login-config>
        <auth-method>FORM</auth-method>
        <realm-name>IDP Application</realm-name>
        <form-login-config>
          <form-login-page>/jsp/login.jsp</form-login-page>
          <form-error-page>/jsp/error.jsp</form-error-page>
        </form-login-config>
      </login-config>
      <!-- Security roles referenced by this web application -->
      <security-role>
        <description>The role that is required to log in to the IDP Application</description>
        <role-name>All</role-name>
      </security-role>
    </web-app>

    注意

    建议应用中定义欢迎页面。默认情况下,JBoss EAP 将查找名为 index.jsp 的文件,但这可以在 web.xml 中使用 <welcome-file-list> 进行配置。

    login.jsp 文件示例:

    <html>
      <head></head>
      <body>
        <form id="login_form" name="login_form" method="post" action="j_security_check" enctype="application/x-www-form-urlencoded">
          <center> <p>Welcome to the <b>IDP</b></p> <p>Please login to proceed.</p> </center>
          <div style="margin-left: 15px;">
            <p> <label for="username">Username</label> <br /> <input id="username" type="text" name="j_username"/> </p>
            <p> <label for="password">Password</label> <br /> <input id="password" type="password" name="j_password" value=""/> </p>
            <center> <input id="submit" type="submit" name="submit" value="Login"/> </center>
          </div>
        </form>
      </body>
    </html>

    error.jsp 文件示例:

    <html>
      <head></head>
      <body>
        <p>Login failed, please go back and try again.</p>
      </body>
    </html>

  3. 为 IDP 配置身份验证器。

    身份验证器负责用户身份验证,以及发布和验证 SAML v2 安全断言。通过定义要在验证和授权主体时使用的安全域(请参阅第 1 步),验证器的一部分已在 jboss-web.xml 文件中配置。您还必须确保 web.xml 中指定了 <login-config> ,并且已声明必要的依赖项

    jboss-web.xml 文件必须具有以下内容:

    • <security-domain>,用于指定用于身份验证和授权的安全域。

    jboss-web.xml 文件示例

    <jboss-web>
      <security-domain>idp</security-domain>
      <context-root>identity</context-root>
    </jboss-web>

  4. 声明 IDP 所需的依赖关系。

    Web 应用充当 IDP 要求在 jboss-deployment-structure.xml 中定义依赖项,以便能够找到 org.picketlink 类。JBoss EAP 提供所有必需的 org.picketlink 和相关类,应用程序只需要将其声明为使用它们的依赖项。

    使用 jboss-deployment-structure.xml 进行 Declare 依赖项

    <jboss-deployment-structure>
      <deployment>
        <dependencies>
          <module name="org.picketlink" services="import"/>
        </dependencies>
      </deployment>
    </jboss-deployment-structure>

    注意

    在之前的 JBoss EAP 版本中,您已声明过同样的依赖关系,但会声明一个 valve 以安装 SAML 身份验证器。随着 JBoss EAP 7 中 Undertow 的引入,您现在使用 services="import" 来安装 SAML 身份验证器。

  5. 为 IDP 创建 和配置 picketlink.xml 文件。

    该文件必须至少包含以下元素:

    • <PicketLinkIDP> 定义 IDP 的 URL、使用 <IdentityURL> 和 IDP 信任的任何主机。
    • <Handlers> 定义处理 SAML 请求和响应所需的一组处理程序。

    picketlink.xml 文件示例

    <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
      <PicketLinkIDP xmlns="urn:picketlink:identity-federation:config:2.1">
        <IdentityURL>${idp.url::http://localhost:8080/identity/}</IdentityURL>
        <Trust>
          <Domains>localhost,example.com</Domains>
        </Trust>
      </PicketLinkIDP>
      <Handlers xmlns="urn:picketlink:identity-federation:handler:config:2.1">
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2IssuerTrustHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2LogOutHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2AuthenticationHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.RolesGenerationHandler" />
      </Handlers>
    </PicketLink>

    警告

    处理程序通过责任链来实施,每个处理程序按照 selectet link.xml 定义的顺序执行请求和响应的逻辑。务必要注意处理程序的配置顺序。

    默认情况下,optetlink.xml 位于 IDP Web 应用的 WEB-INF 目录中。不过,可以配置应用程序外部的 picket link.xml 的自定义路径。当一个或多个 JBoss EAP 实例的多个应用共享相同的 picket link.xml 配置时,这很有用。

  6. 可选: 为 picket link.xml设置自定义位置

    您可以使用 CONFIG_FILE 参数为 picketlink.xml 指定自定义位置。这可以通过在 web.xml 中添加 <context-param> 元素来完成。

    使用 CONFIG_FILE 参数

    <context-param>
      <param-name>CONFIG_FILE</param-name>
      <param-value>/path/to/picketlink.xml</param-value>
    </context-param>

    您还可以使用 org.picketlink.federation.saml.CONFIG_PROVIDER 参数来指定自定义配置供应商。这可让您创建一个扩展 org.picketlink.identity.federation.web.util.SAMLConfigurationProvider 的自定义实现,以提供自己的配置逻辑。

    使用 org.picketlink.federation.saml.CONFIG_PROVIDER Parameter

    <context-param>
      <param-name>org.picketlink.federation.saml.CONFIG_PROVIDER</param-name>
      <param-value>MyConfigurationProvider</param-value>
    </context-param>

    注意

    显示的管理 CLI 命令假定您在运行 JBoss EAP 单机服务器。有关将管理 CLI 用于 JBoss EAP 受管域的更多详细信息,请参见 JBoss EAP管理 CLI 指南

2.2.2. 设置 SP

要将应用程序设置为 SP,必须执行以下步骤:

注意

在创建和部署应用之前,必须先创建和配置安全域。

  1. 为 SP 配置安全域.

    由于 IDP 处理用户的凭据挑战并发布 SAML v2 安全断言,SP 负责验证这些断言。仍然需要安全域才能执行此验证,但身份存储则不需要。在这种情况下,SP 的安全域必须使用 SAML2LoginModule

    用于添加安全域的管理 CLI 命令

    /subsystem=security/security-domain=sp:add(cache-type=default)
    
    /subsystem=security/security-domain=sp/authentication=classic:add
    
    /subsystem=security/security-domain=sp/authentication=classic/login-module=org.picketlink.identity.federation.bindings.jboss.auth.SAML2LoginModule:add(code=org.picketlink.identity.federation.bindings.jboss.auth.SAML2LoginModule,flag=required)
    
    reload

    警告

    SAML2LoginModule 仅用于使用 PicketLink 和 SAML 的应用,且不应在没有 PicketLink Service Provider Undertow ServletExtension(org.picketlink.identity.federation.bindings.wildfly.sp.SPServletExtension)的情况下使用。这样做会带来潜在的安全风险,因为 SAML2LoginModule 或 SAML2CommonLoginModule 将始终接受 EMPTY_STR 的默认密码。例如,如果 SP 应用中没有安装 PicketLink Service Provider Undertow ServletExtension,也会发生这种情况。在为 JBoss EAP 配置 SP 应用时,PicketLink Service Provider Undertow ServletExtension 会自动安装。如果 SAML2LoginModule 与其他登录模块堆叠时,也会发生这种情况:

    <security-domain name="sp" cache-type="default">
      <authentication>
        <login-module code="org.picketlink.identity.federation.bindings.jboss.auth.SAML2LoginModule" flag="optional">
          <module-option name="password-stacking" value="useFirstPass"/>
        </login-module>
        <login-module code="UsersRoles" flag="required">
          <module-option name="usersProperties" value="users.properties"/>
          <module-option name="rolesProperties" value="roles.properties"/>
          <module-option name="password-stacking" value="useFirstPass"/>
        </login-module>
      </authentication>
    </security-domain>

    SAML2LoginModule 用于根据断言为用户构建安全上下文。PicketLink SAML Authenticator,由 PicketLink Service Provider Undertow ServletExtension(org.picketlink.identity.federation.bindings.wildfly.sp.SPServletExtension)使用 SAML2LoginModule,并允许将身份验证决策延迟到 IDP, 它在 SP 的 picket link.xml 中配置。

    验证器负责根据安全断言(在本例中为 SAML 断言)验证由 IDP 颁发的主体。它们截获向应用发出的每个请求,检查请求中是否存在 SAML 断言,验证断言,执行主体的 SAML 特定验证,并在请求的应用中创建主体的安全上下文。

    身份验证器的一部分在 jboss-web.xml 文件中配置,方法是定义要在身份验证和授权主体时使用的安全域。您还必须确保在 web.xml 中指定 <login-config> 并声明必要的依赖项,这在后续步骤中完成。

    SP 的 jboss-web.xml 文件必须具有以下内容:

    • <security-domain>,用于指定用于身份验证和授权的安全域。

    jboss-web.xml 文件示例

    <jboss-web>
      <security-domain>sp</security-domain>
      <context-root>sales-post</context-root>
    </jboss-web>

  2. 为 SP 配置 web.xml 文件。

    SP 的 web.xml 文件必须包含以下内容:

    • 带有 < web-resource-collection> 的 <security-constraint >,其中包含一个 <url-pattern>,它映射到安全区域的 URL 模式。另外,<security-constraint> 也可以包含 <auth-constraint> 来 替代允许的角色。
    • 如果在 <auth-constraint> 中指定了任何角色,这些角色应在 <security-role> 中定义。
    • 带有 < auth-method> 指定 FORM 身份验证 的 <login-config >SAML 验证器需要此项

    web.xml 文件示例

    <web-app>
      <display-name>SP</display-name>
      <description>SP</description>
      <!-- Define a Security Constraint on this Application -->
      <security-constraint>
        <web-resource-collection>
          <web-resource-name>SP</web-resource-name>
          <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
          <role-name>All</role-name>
        </auth-constraint>
      </security-constraint>
      <!-- Security roles referenced by this web application -->
      <security-role>
        <description> The role that is required to log in to the SP Application </description>
        <role-name>All</role-name>
      </security-role>
      <!-- Define the Login Configuration for this Application -->
      <login-config>
        <auth-method>FORM</auth-method>
      </login-config>
    </web-app>

    注意

    建议您在应用中定义一个欢迎页面。默认情况下,JBoss EAP 会查找名为 index.jsp 的文件,但可以使用 web.xml 中的 <welcome-file-list> 进行配置。

    注销过程会尝试重定向主体以在成功注销时重定向 logout.jsp。确保此文件在应用的根目录中定义。

  3. 声明 SP 所需的依赖关系。

    Web 应用充当 SP 要求在 jboss-deployment-structure.xml 中定义依赖项,以便能够找到 org.picketlink 类。JBoss EAP 提供所有必需的 org.picketlink 和相关类,应用程序只需要将其声明为使用它们的依赖项。

    使用 jboss-deployment-structure.xml 进行 Declare 依赖项

    <jboss-deployment-structure>
      <deployment>
        <dependencies>
          <module name="org.picketlink" services="import"/>
        </dependencies>
      </deployment>
    </jboss-deployment-structure>

    注意

    在之前的 JBoss EAP 版本中,您已声明过同样的依赖关系,但会声明一个 valve 以安装 SAML 身份验证器。随着 JBoss EAP 7 中引入 Undertow,您无需使用 PicketLink SAML Authenticators 手动配置部署。现在,当您定义使用 services="import"org.picketlink 依赖项时会自动配置它们。您必须声明此配置,才能为您的部署启用 SAML。

  4. 为 SP 创建和配置 picketlink.xml 文件.

    该文件必须至少包含以下元素:

    • <PicketLinkSP> 定义 IDP 的 URL(<IdentityURL>)和 SP(<ServiceURL>)的 URL。
    • <Handlers> 定义处理 SAML 请求和响应所需的一组处理程序。

    picketlink.xml 文件示例

    <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
      <PicketLinkSP xmlns="urn:picketlink:identity-federation:config:2.1" BindingType="POST">
        <IdentityURL>${idp.url::http://localhost:8080/identity/}</IdentityURL>
        <ServiceURL>${sales-post.url::http://localhost:8080/sales-post/}</ServiceURL>
      </PicketLinkSP>
      <Handlers xmlns="urn:picketlink:identity-federation:handler:config:2.1">
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2LogOutHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2AuthenticationHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.RolesGenerationHandler" />
      </Handlers>
    </PicketLink>

    注意

    不推荐使用 SP,但也可以将 SP 配置为使用 HTTP/REDIRECT,方法是将 BindingType="POST" 更改为 BindingType="REDIRECT"。

    警告

    处理程序通过责任链来实施,每个处理程序按照 selectet link.xml 定义的顺序执行请求和响应的逻辑。务必要注意处理程序的配置顺序。

    默认情况下,optetlink.xml 位于 SP Web 应用的 WEB-INF 目录中;但是,可以配置应用程序外部的 picket link.xml 的自定义路径。当一个或多个 JBoss EAP 实例的多个应用共享相同的 picket link.xml 配置时,这很有用。

  5. 可选: 为 picket link.xml 设置自定义位置。

    您可以使用 CONFIG_FILE 参数为 picketlink.xml 指定自定义位置。这可以通过在 web.xml 中添加 <context-param> 元素来完成。

    使用 CONFIG_FILE 参数

    <context-param>
      <param-name>CONFIG_FILE</param-name>
      <param-value>/path/to/picketlink.xml</param-value>
    </context-param>

    您还可以使用 org.picketlink.federation.saml.CONFIG_PROVIDER 参数来指定自定义配置供应商。这可让您创建一个扩展 org.picketlink.identity.federation.web.util.SAMLConfigurationProvider 的自定义实现,以提供自己的配置逻辑。

    使用 org.picketlink.federation.saml.CONFIG_PROVIDER Parameter

    <context-param>
      <param-name>org.picketlink.federation.saml.CONFIG_PROVIDER</param-name>
      <param-value>MyConfigurationProvider</param-value>
    </context-param>

    注意

    显示的管理 CLI 命令假定您在运行 JBoss EAP 单机服务器。有关将管理 CLI 用于 JBoss EAP 受管域的更多详细信息,请参见 JBoss EAP管理 CLI 指南

2.2.3. 使用 SP 启动流

SP 启动流是描述基于浏览器的单点登录时常见的用例,在基于浏览器的 SSO 中使用 JBoss EAP 安全架构指南的 SAML 和多个红帽 JBoss 企业应用平台实例以及多个应用进行介绍。总之,在 SP 中尝试访问安全资源的主要尝试是:SP 通过检查主体的安全断言并将任何未经身份验证的主体重定向到 IDP 来开始流。在成功通过 IDP 验证后,主体将重新定向到初始 SP,使其安全断言 SP 验证和允许/拒绝访问请求的原始资源。

演练

  1. 访问 SP 上受保护资源的常见尝试。
  2. SP 对主体执行检查。如果主体尚未通过身份验证,则需要将其重定向到 IDP。如果已通过身份验证,则跳过所有其他步骤并执行最后一步。
  3. SP 查找 IDP,并使用主体的浏览器向 IDP 发出身份验证请求。
  4. IDP 会尝试使用配置的身份存储来验证主体,例如,通过登录页面向他们挑战。
  5. 在主体由 IDP 标识后(例如成功登录后),IDP 会使用主体的浏览器向 SP 发出包含 SAML v2 断言的 SAML v2 断言的响应。
  6. SP 根据这些断言中包含的信息,对主体的安全断言进行检查,SP 允许或拒绝访问请求的资源。

此流程不需要额外的步骤或用于设置的配置。所有重定向都由配置的 SP 和 IDP 处理,到受保护和不安全的资源的链接不需要额外的更改。

2.2.4. 使用 IDP 启动流

大多数基于浏览器、带有 SAML v2 的单点登录的示例使用 SP 启动的流程,如上一节中所述。但是,SAML v2 支持额外的流:IDP 启动或非请求的响应流。在这种情况下,SP 不会启动身份验证流,并从 IDP 接收 SAML 响应。相反,流程从 IDP-side 开始,经过身份验证后,主体可以从列表中选择特定的 SP,然后重定向到其 URL。

2.2.4.1. 演练

  1. 主体访问 IDP.
  2. IDP 认为没有 SAML 请求或响应,假设 IDP 优先场景使用 SAML。
  3. IDP 挑战了认证主体。
  4. 身份验证后,IDP 会显示托管部分,主体显示一个页面,链接到所有 SP 应用程序。
  5. 主体选择 SP 应用程序。
  6. IDP 在查询参数中使用 SAML 断言,将主体重定向到 SP。如果使用 POST 绑定,IDP 会使用 HTTP POST 将 SAML 断言发送到服务提供商。
  7. SP 检查 SAML 断言并提供访问权限。

2.2.4.2. 托管部分

Hosted 部分 是一个位置,用于在 IDP 启动流中成功验证后指示用户,或者如果已经通过身份验证的主体尝试直接访问 IDP 的根目录。默认情况下,托管部分位于 /hosted/,但可以 通过将 HostedURI 属性添加到 <PicketLinkIDP> 元素来更改:

<PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
  <PicketLinkIDP xmlns="urn:picketlink:identity-federation:config:2.1" HostedURI="/hosted/">
    ...
  </PicketLinkIDP>
</Picketlink>

2.2.4.3. 链接到 SP

当用户通过身份验证时,IDP 会显示一个页面,其中包含指向所有服务提供商应用程序的链接。链接通常如下:

<a href="http://localhost:8080/identity?SAML_VERSION=2.0&TARGET=http://localhost:8080/sales-post/">Sales</a>

请注意,上面的链接会将用户重定向到传递 TARGET 查询参数的 IDP,该参数的值是目标 SP 应用程序的 URL。当用户单击上述链接时,IDP 会从请求中提取 TARGET 参数,构建 SAML v2 响应,并将用户重定向到目标 URL。当用户命中 SP 时,它们会被自动验证。SAML_VERSION 查询参数用于指定 IDP 创建 SAML 响应时必须使用的 SAML 版本。

2.2.5. 配置全局注销配置集

在一个服务提供商发起的一个全局注销配置文件,从身份提供程序(IDP)和所有服务提供商注销该用户。

注意

要使全局注销配置集正常工作,请确保每个 IDP 最多配置 5 个 SP。

  1. 配置 picketlink.xml

    在 picket link.xml 中添加 SAML2LogOutHandler

  2. 创建 logout.jsp 页面。

    作为注销过程的一部分,用户重定向到位于服务提供商应用的根目录中的 logout.jsp 页面。确保已创建了此页面。

    logout.jsp 示例

    <html>
      <head></head>
      <body>
        <p>You have successfully logged out.</p>
      </body>
    </html>

  3. 为 SP 配置全局注销配置文件链接。

    使用 GLO=true 作为 SP 资源链接中的 URL 参数来启动全局注销配置文件进程。

    Logout Link 示例

    <a href="?GLO=true">Click to log out</a>

2.2.6. 使用本地注销

除了全局注销配置文件外,也可以使用本地注销。与 Global Logout Profile 不同,本地注销在单一 SP 中记录一个主体,同时将会话保留在 IDP 和其他 SP 中。基本上,本地注销允许主体在一个 SP 上"本地注销"。

使用本地注销的过程基本上与全局注销配置文件相同,注销链接中的 URL 参数采用 LLO=true 的形式。

Logout Link 示例

<a href="?LLO=true">Click to log out</a>

当主体单击 SP 的本地 Logout 链接时,SP 将使其会话无效,并将主体转发到配置的注销页面。

警告

当一个主体只从一个服务提供商断开连接时,它们仍然与 IDP 和其他 SP 保持活跃会话,可能允许它们仍然访问受保护的资源。尽管在某些情况下可能需要使用此行为,但强烈建议在大多数情形中使用全局注销。

2.3. 通过 Federation 子系统配置 INP 和 SP

除了手动配置 IDP 和 SP 外,使用 SAML v2 的单点登录也可以使用 JBoss EAP 子系统进行配置。这种配置方法称为 域模型,允许所有配置集中放在 JBoss EAP 实例上,而不是个别应用。这也允许使用 JBoss EAP 管理界面(如管理控制台和管理控制台)创建和更新单点登录配置。

federations

在使用 JBoss EAP 子系统配置和部署 Ins 和 SP 时,它们按照联合分组 联盟可以理解 为信任链。信任链包含共享通用配置的应用,包括证书和 SAML 特定的配置。它还包含相互信任的域,这些域可准确记录用于标识用户的进程、使用的身份验证系统的类型,以及与生成的身份验证凭据关联的任何策略。每个联合都有一个 IDP 和多个 SP。联合还定义了 SP 和 IDP 之间的信任关系,免除了每个 SP 单独跟踪和维护该信息的需求。

2.3.1. 配置子系统

在可以使用子系统设置联合之前,需要在 JBoss EAP 中启用和配置子系统。启用和配置子系统需要以下步骤:

注意

建议您在执行这些步骤之前关闭 JBoss EAP 实例。

  1. 更新扩展。

    在 JBoss EAP 配置文件、用于单机实例的 standalone.xml域的 domain.xml 中,添加 org.wildfly.extension.picketlink 扩展:

    <extensions>
      ...
      <extension module="org.wildfly.extension.picketlink"/>
      ...
    </extensions>
  2. 添加子系统。

    在 JBoss EAP 配置文件(用于 独立实例或 域的 domain.xml )的 standalone.xml 中,添加 picketlink-federation 子系统:

    <profile>
      ...
      <subsystem xmlns="urn:jboss:domain:picketlink-federation:2.0"/>
       ...
    </profile>
    注意

    也可以在 EAP_HOME/docs/examples/configs/standalone-picketlink.xml 中找到配置示例。

2.3.2. 设置联盟

设置和配置子系统后,您可以使用管理接口来配置联合。在使用子系统设置联合之前,您必须准备 IDP 和 SP 应用程序。

2.3.2.1. 准备 SP 和 IDP 应用程序

如上一节所述,手动使用 SAML v2 配置单点登录时,需要创建或更新以下文件:

  • web.xml
  • jboss-web.xml
  • picketlink.xml
  • jboss-deployment-structure.xml

在使用 SAML v2 为单点登录使用 SAML v2 设置子系统时,大部分配置都是从管理接口中进行,而无需更新任何这些文件。唯一必要的配置是,在 I.xml 和 SP web.xml 文件中配置 <security-constraint> 和 关联的 <security-role >。此外,web .xml 中的 <login-config> 以及登录和错误页面也必须出现在 IDP 中。

如果 IDP 或 SP 已按照上一节所述进行了配置,则需要删除以下文件:

  • jboss-web.xml
  • picketlink.xml
  • jboss-deployment-structure.xml

准备好应用后,必须将它们部署到 JBoss EAP 实例。

2.3.2.2. 使用管理 CLI 创建联盟

以下命令显示如何使用以下信息添加名为 new-federation 的示例联合:

要使用管理 CLI 配置联合,您必须:

  1. 添加新联合。

    /subsystem=picketlink-federation/federation=new-federation:add
  2. 向联合中添加身份提供程序。

    /subsystem=picketlink-federation/federation=new-federation/identity-provider=IDP.war:add(url="http://localhost:8080/identity/",security-domain=idp)
  3. 向联合中添加服务提供商。

    /subsystem=picketlink-federation/federation=new-federation/service-provider=SP.war:add(url="http://localhost:8080/sales-post/",security-domain=sp)
  4. 向联合中添加信任域。

    /subsystem=picketlink-federation/federation=new-federation/identity-provider=IDP.war/trust-domain="localhost:8080":add

2.3.2.3. 联合子系统属性参考

picketlink-federation 子系统具有以下结构:

联合

  • saml
  • key-store

    • Keys

      • key
  • identity-provider

    • trust

      • trust-domain
    • role-generator
    • attribute-manager
    • 处理程序

      • handler

        • handler-parameter
  • service-providers

    • service-provider

      • 处理程序

        • handler

          • handler-parameter

联合子系统示例

<subsystem xmlns="urn:jboss:domain:picketlink-federation:2.0">
  <federation name="federation-redirect-with-signatures">
    <key-store file="/jbid_test_keystore.jks" password="store123" sign-key-alias="servercert" sign-key-password="test123">
      <keys>
        <key name="servercert" host="${jboss.bind.address:localhost},127.0.0.1"/>
      </keys>
    </key-store>
    <identity-provider name="idp-redirect-sig.war" url="http://${jboss.bind.address:127.0.0.1}:8080/idp-redirect-sig/" security-domain="idp" support-signatures="true" strict-post-binding="false">
      <trust>
        <trust-domain name="${jboss.bind.address:127.0.0.1}"/>
      </trust>
      <handlers>
        <handler class-name="com.mycompany.CustomHandler">
          <handler-parameter name="param1" value="paramValue1"/>
          <handler-parameter name="param2" value="paramValue2"/>
          <handler-parameter name="param3" value="paramValue3"/>
        </handler>
      </handlers>
    </identity-provider>
    <service-providers>
      <service-provider name="sp-redirect-sig1.war" security-domain="sp" url="http://${jboss.bind.address:127.0.0.1}:8080/sp-redirect-sig1/" post-binding="false" support-signatures="true">
        <handlers>
          <handler class-name="com.mycompany.CustomHandler">
            <handler-parameter name="param1" value="paramValue1"/>
            <handler-parameter name="param2" value="paramValue2"/>
            <handler-parameter name="param3" value="paramValue3"/>
          </handler>
        </handlers>
      </service-provider>
      <service-provider name="sp-redirect-sig2.war" security-domain="sp" url="http://${jboss.bind.address:127.0.0.1}:8080/sp-redirect-sig2/" post-binding="false" support-signatures="true"/>
    </service-providers>
  </federation>
</subsystem>

表 2.1. 联合

属性默认描述

name

 

联合名称。

saml

定义 SAML 类型。此类型定义如何处理和创建 SAML 断言的所有配置。

属性默认描述

clock-skew

0

定义 SAML 断言的时钟偏移。该值必须以毫秒为单位指定。

token-timeout

5000

定义 SAML 断言的超时时间。该值必须以毫秒为单位指定。

key-store

定义 KeyStore 类型。这种类型定义密钥存储的配置方式。

属性默认描述

password

 

定义密钥存储的密码。

sign-key-alias

 

定义签名文档时使用的别名。

sign-key-password

 

定义 sign-key-alias 的密码。

file

 

定义文件位置。

relative-to

 

个系统提供的命名路径,如 jboss.home.diruser.home、user.dir,相对于其为 file 属性中指定的路径计算绝对路径。

Keys

密钥配置.

key

定义密钥.

属性默认描述

name

 

定义给定密钥存储中密钥的名称或别名。

主机

 

代表给定密钥验证的主机名的单个或以逗号分隔的字符串列表。

identity-provider

定义身份提供程序类型。

属性默认描述

name

 

身份提供程序的唯一名称。名称必须是部署单元名称。例如,idp.war

url

 

此身份提供程序的 URL.

support-signatures

false

指明是否支持签名。

encrypt

false

指明是否支持加密。

security-domain

 

用于验证和授权用户的安全域的名称。如果 IDP 不是外部,则需要此属性。如需了解更多详细信息,请参阅 external 属性。

strict-post-binding

true

指明 IDP 应始终使用 HTTP POST 绑定做出响应。

external

false

指明配置是否引用外部 IDP。

support-metadata

false

启用/禁用 SAML 元数据支持.

ssl-authentication

false

指明身份提供程序还应支持 HTTP CLIENT_CERT 身份验证。

trust

组受信任的域类型.

trust-domain

定义受信任的域类型。

属性默认描述

name

 

定义域名。

cert-alias

 

定义此域的证书别名。

role-generator

角色生成器 实施,用于加载角色并将其推送到 SAML 断言。

属性默认描述

name

 

定义角色生成器名称。

class-name

 

RoleGenerator 类型的完全限定名称。

Code

 

定义映射到内置类型的别名。

module

 

定义加载 class-name 时要使用的模块。

attribute-manager

AttributeManager 实施,用于加载角色并将其推送到 SAML 断言。

属性默认描述

name

 

定义属性管理器名称。

class-name

 

AttributeManager 类型的完全限定名称。

Code

 

定义映射到内置类型的别名。

module

 

定义加载 class-name 时要使用的模块。

处理程序

组处理程序类型.

handler

定义处理程序类型。

属性默认描述

name

 

定义处理程序名称。

class-name

 

定义处理程序类名称。

Code

 

定义映射到内置类型的别名。

handler-parameter

定义处理程序参数类型.

属性默认描述

name

 

定义参数名称。

value

 

定义参数值。

service-providers

对服务提供商类型进行分组.

service-provider

定义服务提供商类型。

属性默认描述

name

 

此实例的名称。此名称必须是部署单元名称。

url

 

此服务提供商的 URL.

post-binding

true

指明要使用的 SAML 绑定。如果为 true,将使用 HTTP POST 绑定。否则将使用 HTTP REDIRECT 绑定。

strict-post-binding

true

指明要使用的 SAML 绑定。如果为 true,将使用 HTTP POST 绑定。否则将使用 HTTP REDIRECT 绑定。

support-signatures

false

指明是否支持签名。

support-metadata

false

启用/禁用 SAML 元数据支持.

security-domain

 

用于验证用户身份的安全域名.

error-page

/error.jsp

定义自定义错误页面位置。

logout-page

/logout.jsp

定义自定义注销页面位置。

2.4. 为 INP 配置 Identity Stores

由于 IDP 使用安全域,所以 IDP 的功能与支持它的实际身份存储无关。因此,管理员在为 IDP 配置安全域时有许多选项。有关安全域和登录模块的详细信息,请参阅 JBoss EAP 安全架构指南的安全 https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.3/html-single/security_architecture/#security_subsystem 子系统小节。与为安全域设置任何登录模块一样,请注意不同的身份存储可提供不同的功能和性能权衡。

设置使用身份存储的安全域时需要执行以下步骤:

注意

在本文档中,Database 登录模块和 LDAP 登录模块显示为示例,但也可以配置其他身份存储和登录模块以用于 IDP。

注意

显示的管理 CLI 命令假定您在运行 JBoss EAP 单机服务器。有关将管理 CLI 用于 JBoss EAP 受管域的更多详细信息,请参见 JBoss EAP管理 CLI 指南

  1. 设置身份存储。

    在可以将安全域和登录模块配置为使用身份提供程序之前,必须先设置身份提供程序,有时也必须设置与该身份提供程序的连接。

    1. 为 Database 登录模块配置身份存储。

      数据库支持的身份存储所需的第一项是数据库,供登录模块使用。

      需要以下数据点:

      • 用户名
      • 密码
      • 角色
      • Role Groups

      Database Login 模块需要能够创建将用户名映射到密码的查询,以及将用户名映射到角色和角色组的查询。这些信息可以通过多种方式存储在数据库中,但创建包含表的数据库不在本指南的范围之内。本例中假定已创建下表:

      表 2.2. SSO-users

      usernamepasswd

      Sarah

      测试123!

      表 2.3. samba-roles

      usernamerole

      role-group

      Sarah

      示例

      samba-Users

      创建数据源不在本指南的范围之内。有关设置数据源的详细信息,请参阅 JBoss EAP 配置指南中的 Datasource Management 部分。

      本例中假定已创建、正确配置了名为 idpDS 的数据源,并将其部署到 JBoss EAP 实例。此数据源连接到存储 sso-users 和 sso- roles 表的数据库。

    2. 配置 LDAP 登录模块的身份存储。

      设置 LDAP 登录模块之前,需要正确配置的 LDAP 服务器。与 Database 登录模块不同,设置 LDAP 登录模块时不需要数据源。JBoss EAP 安全架构指南介绍了 LDAP 的基础知识及其与 JBoss EAP 安全性 的关系

      1. 设置 LDAP 服务器。

        设置 LDAP 服务器不在本指南的范围之内。在本例中,可以通过 http://ldaphost.example.com:1389/ 访问 LDAP 服务器。

      2. 目录信息示例:

        LDAP 服务器的目录结构和组织可能会有很大差异,具体取决于用例和组织需求。本例中创建了以下条目,以 LDIF 格式显示:

        dn: dc=example,dc=com
        objectclass: top
        objectclass: dcObject
        objectclass: organization
        dc: example
        o:  Example
        #=============================
        dn: ou=People,dc=example,dc=com
        objectclass: top
        objectclass: organizationalUnit
        ou: People
        #=============================
        dn: uid=jsmith,ou=People,dc=example,dc=com
        objectclass: top
        objectclass: uidObject
        objectclass: person
        uid: jsmith
        cn: John
        sn: Smith
        userPassword: theduke
        #=============================
        dn: ou=Roles,dc=example,dc=com
        objectclass: top
        objectclass: organizationalUnit
        ou: Roles
        #=============================
        dn: cn=Sample,ou=Roles,dc=example,dc=com
        objectclass: top
        objectclass: groupOfNames
        cn: Sample
        member: uid=jsmith,ou=People,dc=example,dc=com
        description: the Sample group
  2. 添加安全域。

    旦设置了身份存储本身,并且配置了 JBoss EAP 实例和身份存储之间的连接,即可创建和配置安全域。以下命令显示如何创建空的安全域:将 MY-DOMAIN 替换为所需安全域的名称。

    用于添加安全域的管理 CLI 命令

    /subsystem=security/security-domain=MY-DOMAIN:add(cache-type=default)

  3. 将 authentication 部分和 login 模块添加到安全域。创建空安全域后,必须通过添加登录模块为其创建身份验证部分。以下命令显示如何向现有安全域添加空身份验证部分。

    将身份验证部分添加到安全域的管理 CLI 命令

    /subsystem=security/security-domain=MY-DOMAIN/authentication=classic:add

    空身份验证部分创建好后,可以添加登录模块并配置为使用所需的身份存储。将登录模块添加到安全域后,通常需要重新加载配置。

    以下是用于添加登录模块和重新加载配置的常规命令结构。将 MY-DOMAINMY-LOGIN-MODULEMY-CONFIGURATION 替换为适当的值:

    /subsystem=security/security-domain=MY-DOMAIN/authentication=classic/login-module=MY-LOGIN-MODULE:add(MY-CONFIGURATION)
    
    reload
    • 添加 Database 登录模块。

      注意

      本例假定 步骤 1 中已创建了名为 idpDS 的数据源,并且第 2 步 中创建了名为 idp-db-domain 的安全域。

      配置身份验证部分的管理 CLI 命令以使用数据库登录模块

      /subsystem=security/security-domain=idp-db-domain/authentication=classic/login-module=Database:add(code=Database,flag=required,module-options=[("dsJndiName"=>"java:/idpDS"),("principalsQuery"=>"select passwd from 'sso-users' where username=?"),("rolesQuery"=>"select role, role-group from 'sso-roles' where username=?")])
      
      reload

    • 添加 LDAP 登录模块。

      配置 LdapExtended 登录 模块所需的步骤可在 How to Configure Identity Management 中找到。

2.5. 使用 SP 和 IDP 配置 SSL/TLS

JBoss EAP 安全架构指南 介绍了 SSL/TLS 的基础知识。在基于浏览器的单点登录环境中添加 SSL/TLS 支持与将其添加到非单点登录环境有很大不同。INP 和 SP 可以添加 HTTPS 连接器来保护流量。

如果还没有创建,则必须创建具有 SSL/TLS 服务器身份的安全域。它还必须配置 SSL/TLS 证书。

2.5.1. 使用传统安全 Realms 为应用程序启用单向 SSL/TLS

本例假定密钥存储 identity.jks 已复制到服务器配置目录中,并且配置了给定的属性。管理员应当将自己的值替换为示例值。

注意

显示的管理 CLI 命令假定您在运行 JBoss EAP 单机服务器。有关将管理 CLI 用于 JBoss EAP 受管域的更多详细信息,请参见 JBoss EAP管理 CLI 指南

  1. 首先添加和配置 HTTPS 安全域。配置 HTTPS 安全域后,在 undertow 子系统中配置 https-listener 来引用安全域:

    batch
    
    /core-service=management/security-realm=HTTPSRealm:add
    
    /core-service=management/security-realm=HTTPSRealm/server-identity=ssl:add(keystore-path=identity.jks, keystore-relative-to=jboss.server.config.dir, keystore-password=password1, alias=appserver)
    
    /subsystem=undertow/server=default-server/https-listener=https:write-attribute(name=security-realm, value=HTTPSRealm)
    
    run-batch
    警告

    红帽建议显式禁用 SSLv2、SSLv3 和 TLSv1.0,以便在所有受影响的软件包中明确禁用 TLSv1.1 或 TLSv1.2。

  2. 重新启动 JBoss EAP 实例,使更改生效。

2.6. 配置身份提供程序以使用基于证书的身份验证

除了将 SP 和 IDP 配置为使用 SSL/TLS 外,您还可以将 IDP 配置为使用基于证书的身份验证。在设置 IDP 以使用基于证书的身份验证之前,您需要将 IDP 和 SP 配置为使用 SSL/TLS

  1. 创建客户端证书和信任存储。

    您必须创建一个证书和信任存储,供客户端用于进行身份验证。您需要在服务器配置以及客户端的浏览器中使用它们。

    客户端证书和信任存储示例

    $ keytool -genkeypair -alias client -storetype jks -keyalg RSA -keysize 2048 -keypass change_it -keystore client.jks -storepass change_it -dname "CN=client,OU=Sales,O=Systems Inc,L=Raleigh,ST=NC,C=US" -validity 730 -v
    
    $ keytool -export -alias client -keystore client.jks -storepass change_it -file client.cer
    
    $ keytool -import -file client.cer -alias client -keystore client.truststore

  2. 为 IDP 创建安全域.

    您需要创建一个安全域,它使用基于证书的登录模块供 IDP 用于身份验证。有关基于证书的登录模块的详情,请查看Login 模块参考

    使用 CertificateRoles 登录模块的安全域示例

    /subsystem=security/security-domain=idp-cert:add
    
    /subsystem=security/security-domain=idp-cert/authentication=classic:add
    
    /subsystem=security/security-domain=idp-cert/authentication=classic/login-module=CertificateRoles:add(code=CertificateRoles,flag=optional,module-options=[("password-stacking"=>"useFirstPass"),("securityDomain"=>"idp-cert"),("verifier"=>"org.jboss.security.auth.certs.AnyCertVerifier")])
    
    /subsystem=security/security-domain=idp-cert/jsse=classic:add(truststore={url=>"/path/to/client.jks",password=>change_it})
    
    reload

    您还需要将 IDP 配置为使用此安全域。有关配置 IDP 的详情,请参阅设置 IDP 部分。

    注意

    您还可以将 RegExUserNameLoginModule 与证书登录模块结合使用,以从主体名称中提取用户名、UID 或其他信息。有关 RegExUserNameLoginModule 的详情,请查看 JBoss EAP 登录模块参考

  3. 将客户端证书导入到客户端的浏览器中。完成 IDP 和服务器配置后,您必须将客户端浏览器配置为使用客户端证书。这种配置因浏览器而异。将客户端的浏览器配置为使用客户端证书后,客户端将能够使用该证书与 IDP 进行身份验证。

2.7. 配置身份提供程序以使用 Kerberos 身份验证

除了其他身份存储外,IDP 还可以将 Kerberos 用作其身份验证机制。要将 IDP 设置为使用 Kerberos,您需要执行以下操作:

注意

它假设您有一个正常工作的 Kerberos 环境。

  1. 配置用于 Kerberos 身份验证的安全域.

    您可以使用以下命令配置 IDP 所需的安全域。如需更多信息,请参阅《如何使用 Kerberos 设置 SSO 指南》的"JBoss EAP 配置传统安全子系统 "一节。

    /subsystem=security/security-domain=host:add(cache-type=default)
    
    /subsystem=security/security-domain=host/authentication=classic:add
    
    /subsystem=security/security-domain=host/authentication=classic/login-module=Kerberos:add(code=Kerberos, flag=required, module-options=[debug=false, storeKey=true, refreshKrb5Config=true, useKeyTab=true, doNotPrompt=true, keyTab=/home/username/service.keytab, principal=host/SERVER_NAME@REALM_NAME])
    
    /subsystem=security/security-domain=app-spnego:add(cache-type=default)
    
    /subsystem=security/security-domain=app-spnego/authentication=classic:add
    
    /subsystem=security/security-domain=app-spnego/authentication=classic/login-module=SPNEGO:add(code=SPNEGO, flag=required, module-options=[serverSecurityDomain=host])

    有关登录模块的更多信息,请参阅 JBoss EAP 登录模块参考中的 Kerberos 登录模块和 SPNEGO 登录模块部分

  2. 为 SP 配置安全域。

    您可以使用以下命令配置 SP 所需的安全域:如需更多信息,请参阅 设置 SP 的完整文档。

    /subsystem=security/security-domain=sp:add(cache-type=default)
    
    /subsystem=security/security-domain=sp/authentication=classic:add
    
    /subsystem=security/security-domain=sp/authentication=classic/login-module=org.picketlink.identity.federation.bindings.jboss.auth.SAML2LoginModule:add(code=org.picketlink.identity.federation.bindings.jboss.auth.SAML2LoginModule,flag=required)
  3. 重新加载服务器以使更改生效。

    reload
  4. 完成上述步骤后,将创建以下配置:

    示例:IDP 和 SP 的安全域

    <security-domain name="host" cache-type="default">
      <authentication>
        <login-module code="Kerberos" flag="required">
          <module-option name="debug" value="false"/>
          <module-option name="storeKey" value="true"/>
          <module-option name="refreshKrb5Config" value="true"/>
          <module-option name="useKeyTab" value="true"/>
          <module-option name="doNotPrompt" value="true"/>
          <module-option name="keyTab" value="/home/username/service.keytab"/>
          <module-option name="principal" value="HTTP/testserver@MY_REALM"/>
        </login-module>
      </authentication>
    </security-domain>
    <security-domain name="app-spnego" cache-type="default">
        <authentication>
            <login-module code="SPNEGO" flag="required">
                <module-option name="serverSecurityDomain" value="host"/>
            </login-module>
        </authentication>
        <mapping>
        ...
        </mapping>
    </security-domain>
    <security-domain name="sp" cache-type="default">
        <authentication>
            <login-module code="org.picketlink.identity.federation.bindings.jboss.auth.SAML2LoginModule" flag="required"/>
        </authentication>
    </security-domain>

  5. 配置 IDP 应用。

    配置 IDP 的过程与设置 IDP 部分所述的相同,但有以下更改:

    • 声明 JBoss Negotiation 的额外依赖性
    • 配置 IDP 应用,以将安全域与 SPNEGO 登录模块搭配使用

      注意

      在配置 IDP 时,您不需要在配置中指定 PicketLinkSTS 元素。如果是异常的 PicketLink,则会从 selectet link-core -VERSION.jar 内名为 core- st 的文件加载默认配置。

      仅在需要时覆盖此配置。例如,更改令牌超时或为 SAML 断言指定自定义安全令牌提供程序。

      示例:使用 Kerberos 和 Picketlink 依赖项的 jboss-deployment-structure.xml

      <jboss-deployment-structure>
        <deployment>
          <dependencies>
            <module name="org.picketlink" services="import"/>
            <module name="org.jboss.security.negotiation"/>
          </dependencies>
        </deployment>
      </jboss-deployment-structure>

      示例:IDP 中的 jboss-web.xml

      <jboss-web>
        <security-domain>app-spnego</security-domain>
        <context-root>identity</context-root>
      </jboss-web>

      示例:使用 PicketLinkSTS 元素的 picket link.xml

      <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
        <PicketLinkIDP xmlns="urn:picketlink:identity-federation:config:2.1">
        <IdentityURL>${idp.url::http://localhost:8080/idp/}</IdentityURL>
          <Trust>
           <Domains>redhat.com,localhost,amazonaws.com</Domains>
          </Trust>
        </PicketLinkIDP>
        <Handlers xmlns="urn:picketlink:identity-federation:handler:config:2.1">
            <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2IssuerTrustHandler" />
            <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2LogOutHandler" />
            <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2AuthenticationHandler" />
            <Handler class="org.picketlink.identity.federation.web.handlers.saml2.RolesGenerationHandler" />
        </Handlers>
        <!-- The configuration bellow defines a token timeout and a clock skew. Both  configurations will be used during the SAML Assertion creation. This configuration is optional. It is defined only to show you how to set the token timeout and clock skew configuration.   -->
        <PicketLinkSTS xmlns="urn:picketlink:identity-federation:config:1.0" TokenTimeout="5000" ClockSkew="0">
          <TokenProviders>
          <TokenProvider
             ProviderClass="org.picketlink.identity.federation.core.saml.v1.providers.SAML11AssertionTokenProvider"
             TokenType="urn:oasis:names:tc:SAML:1.0:assertion"
             TokenElement="Assertion" TokenElementNS="urn:oasis:names:tc:SAML:1.0:assertion" />
          <TokenProvider
             ProviderClass="org.picketlink.identity.federation.core.saml.v2.providers.SAML20AssertionTokenProvider"
             TokenType="urn:oasis:names:tc:SAML:2.0:assertion"
             TokenElement="Assertion" TokenElementNS="urn:oasis:names:tc:SAML:2.0:assertion" />
          </TokenProviders>
        </PicketLinkSTS>
      </PicketLink>

      重要

      您必须确保 IDP web.xml 中配置的任何角色都与 Kerberos 环境中配置的角色匹配。若要实现这一目的,可在 IDP 的安全域中配置第二个登录模块,将适当的角色映射到 SPNEGO 身份验证后,或者在 IDP 安全域中使用映射提供程序。

2.9. 其他功能

2.9.1. SAML 断言加密

除了在 Is 和 SP 之间提供 SSL/TLS 加密外,SAML 断言本身也可进行加密。这可用于保护以不安全方式传输的 SAML v2 断言,例如不使用 SSL/TLS。

要直接在 IDP 和 SP 中对安全断言进行加密,必须在 IDP 和 SP picket link.xml 文件中执行以下步骤:

  1. 启用 加密 和支持系统.

    要启用加密,必须更新 <PicketLinkIDP><PicketLinkSP>

    对于 IDP,将 <PicketLinkIDP> 中的 EncryptSupportsSignatures 属性 添加或更新为 true:

    <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
      ...
      <PicketLinkIDP xmlns="urn:picketlink:identity-federation:config:2.1" Encrypt="true" SupportsSignatures="true">
        ...
      </PicketLinkIDP>
    </PicketLink>

    对于 SP,添加或更新 <PicketLinkSP> 中的 SupportsSignatures 属性 为 true:

    <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
      ...
      <PicketLinkSP xmlns="urn:picketlink:identity-federation:config:2.1" SupportsSignatures="true">
        ...
      </PicketLinkSP>
    </PicketLink>
  2. 添加处理程序.

    此外,处理器必须添加到 <Handlers>

    对于 IDP,将 SAML2EncryptionHandlerSAML2SignatureValidationHandler 添加到 picketlink.xml 文件中:

    <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
      ...
      <Handlers xmlns="urn:picketlink:identity-federation:handler:config:2.1">
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2IssuerTrustHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2LogOutHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2AuthenticationHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.RolesGenerationHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2EncryptionHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2SignatureValidationHandler" />
      </Handlers>
    </PicketLink>

    对于 SP,将 SAML2SignatureGenerationHandlerSAML2SignatureValidationHandler 添加到 picketlink.xml 文件中:

    <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
      ...
      <Handlers xmlns="urn:picketlink:identity-federation:handler:config:2.1">
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2LogOutHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2AuthenticationHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.RolesGenerationHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2SignatureGenerationHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2SignatureValidationHandler" />
      </Handlers>
    </PicketLink>
    警告

    处理程序通过责任链来实施,每个处理程序按照 selectet link.xml 定义的顺序执行请求和响应的逻辑。务必要注意处理程序的配置顺序。

    SAML2SignatureGenerationHandler 不能在与 SAML2EncryptoinHandler 相同的链中配置。这将导致 SAML 消息签名多次。

  3. 配置密钥提供程序.

    最后,必须将 <KeyProvider> 元素添加到 BOTH picket link.xml 文件中。此元素提供用于访问用于加密和解密安全断言的 Java 密钥存储的位置和凭据。有关生成 Java 密钥存储的示例,请参阅 JBoss EAP如何配置服务器安全指南

    对于 IDP,该元素应添加到 <PicketLinkIDP> 中:

    <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
      ...
      <PicketLinkIDP xmlns="urn:picketlink:identity-federation:config:2.1" Encrypt="true" SupportsSignatures="true">
        ...
        <KeyProvider ClassName="org.picketlink.identity.federation.core.impl.KeyStoreKeyManager">
          <Auth Key="KeyStoreURL" Value="/my_keystore.jks" />
          <Auth Key="KeyStorePass" Value="store123" />
          <Auth Key="SigningKeyPass" Value="test123" />
          <Auth Key="SigningKeyAlias" Value="servercert" />
          <ValidatingAlias Key="idp.example.com" Value="servercert" />
          <ValidatingAlias Key="localhost" Value="servercert" />
          <ValidatingAlias Key="sp1.example.com" Value="servercert" />
          <ValidatingAlias Key="sp2.example.com" Value="servercert" />
        </KeyProvider>
        ...
      </PicketLinkIDP>
      ...
    <PicketLink>

    对于 SP,该元素应添加到 <PicketLinkSP> 中:

    <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
      ...
      <PicketLinkSP xmlns="urn:picketlink:identity-federation:config:2.1" SupportsSignatures="true">
        ...
        <KeyProvider ClassName="org.picketlink.identity.federation.core.impl.KeyStoreKeyManager">
          <Auth Key="KeyStoreURL" Value="/my_keystore.jks" />
          <Auth Key="KeyStorePass" Value="store123" />
          <Auth Key="SigningKeyPass" Value="test123" />
          <Auth Key="SigningKeyAlias" Value="servercert" />
          <ValidatingAlias Key="idp.example.com" Value="servercert" />
          <ValidatingAlias Key="localhost" Value="servercert" />
        </KeyProvider>
        ...
      </PicketLinkSP>
    </PicketLink>
    注意

    为了正确加密和解密断言,IDP 需要生成签名,SP 需要验证这些签名并确定签名的来源。这通过 <ValidatingAlias> 元素来完成。对于受信任的每个可信服务器/域,需要有一个 <ValidatingAlias&gt;,这是 <Trust> 元素中的每个条目。SPS 需要 为每个包含 IDP 的服务器/域都有一个 <ValidatingAlias>

2.9.2. 断言中的数字签名

数字签名允许 IDP 为 SAML v2 安全断言签名,并让 SP 验证这些签名和断言。这对于验证断言的真实性非常有用,特别是对于以不安全的方式传输的断言(例如不使用 SSL/TLS)时。

要在安全断言中直接在 IDP 和 SP 中启用数字签名,必须在 IDP 和 SP picket link.xml 文件中执行以下步骤:

  1. 启用 SupportsSignatures

    要启用数字签名,必须更新 <PicketLinkIDP><PicketLinkSP> 元素。

    对于 IDP 和 SP,添加或更新 <PicketLinkSP> 中的 SupportsSignatures 属性 为 true:

    <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
      ...
      <PicketLinkIDP xmlns="urn:picketlink:identity-federation:config:2.1" SupportsSignatures="true">
        ...
      </PicketLinkIDP>
    </PicketLink>
    <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
      ...
      <PicketLinkSP xmlns="urn:picketlink:identity-federation:config:2.1" SupportsSignatures="true">
        ...
      </PicketLinkSP>
    </PicketLink>
  2. 添加处理程序.

    此外,处理器必须添加到 <Handlers>

    对于 IDP 和 SP,将 SAML2SignatureGenerationHandlerSAML2SignatureValidationHandler 添加到 picketlink.xml 文件中:

    IDP picketlink.xml

    <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
      ...
      <Handlers xmlns="urn:picketlink:identity-federation:handler:config:2.1">
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2IssuerTrustHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2LogOutHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2AuthenticationHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.RolesGenerationHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2SignatureGenerationHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2SignatureValidationHandler" />
      </Handlers>
    </PicketLink>

    SP picketlink.xml

    <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
      ...
      <Handlers xmlns="urn:picketlink:identity-federation:handler:config:2.1">
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2LogOutHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2AuthenticationHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.RolesGenerationHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2SignatureGenerationHandler" />
        <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2SignatureValidationHandler" />
      </Handlers>
    </PicketLink>

    警告

    处理程序通过责任链来实施,每个处理程序按照 selectet link.xml 定义的顺序执行请求和响应的逻辑。务必要注意处理程序的配置顺序。

    SAML2SignatureGenerationHandler 不能在与 SAML2EncryptionHandler 相同的链中配置。这将导致 SAML 消息签名多次。

  3. 配置密钥提供程序.

    最后,必须将 <KeyProvider> 元素添加到 BOTH picket link.xml 文件中。此元素提供访问用于签署安全断言的 Java 密钥存储的位置和凭据。有关生成 Java 密钥存储的示例,请参阅 JBoss EAP如何配置服务器安全指南

    对于 IDP,该元素应添加到 <PicketLinkIDP> 中:

    <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
      ...
      <PicketLinkIDP xmlns="urn:picketlink:identity-federation:config:2.1" SupportsSignatures="true">
        ...
        <KeyProvider ClassName="org.picketlink.identity.federation.core.impl.KeyStoreKeyManager">
          <Auth Key="KeyStoreURL" Value="/my_keystore.jks" />
          <Auth Key="KeyStorePass" Value="store123" />
          <Auth Key="SigningKeyPass" Value="test123" />
          <Auth Key="SigningKeyAlias" Value="servercert" />
          <ValidatingAlias Key="idp.example.com" Value="servercert" />
          <ValidatingAlias Key="localhost" Value="servercert" />
          <ValidatingAlias Key="sp1.example.com" Value="servercert" />
          <ValidatingAlias Key="sp2.example.com" Value="servercert" />
        </KeyProvider>
        ...
      </PicketLinkIDP>
      ...
    <PicketLink>

    对于 SP,该元素应添加到 <PicketLinkSP> 中:

    <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
      ...
      <PicketLinkSP xmlns="urn:picketlink:identity-federation:config:2.1" SupportsSignatures="true">
        ...
        <KeyProvider ClassName="org.picketlink.identity.federation.core.impl.KeyStoreKeyManager">
          <Auth Key="KeyStoreURL" Value="/my_keystore.jks" />
          <Auth Key="KeyStorePass" Value="store123" />
          <Auth Key="SigningKeyPass" Value="test123" />
          <Auth Key="SigningKeyAlias" Value="servercert" />
          <ValidatingAlias Key="idp.example.com" Value="servercert" />
          <ValidatingAlias Key="localhost" Value="servercert" />
        </KeyProvider>
        ...
      </PicketLinkSP>
    </PicketLink>
    注意

    为了正确加密和解密断言,IDP 需要生成签名,SP 需要验证这些签名并确定签名的来源。这通过 <ValidatingAlias> 元素来完成。对于受信任的每个可信服务器/域,需要有一个 <ValidatingAlias&gt;,这是 <Trust> 元素中的每个条目。SPS 需要 为每个包含 IDP 的服务器/域都有一个 <ValidatingAlias>

2.9.3. 配置动态帐户 Chooser

如果一个服务提供商配置了多个身份提供程序,您可以将该服务提供商配置为提示用户选择用于验证其凭证的 IDP。要使用动态帐户选择器配置服务提供商,必须执行以下操作:

  1. 配置所有身份提供程序。

    有关设置身份提供程序的详情,请参阅设置 IDP 部分。

  2. 配置 WEB-INF/idpmap.properties 文件。

    您需要创建一个 WEB-INF/idpmap.properties 文件,该文件使用 name=url 列出所有可用身份供应商。

    WEB-INF/idpmap.properties示例

    Domain=http://localhost:8080/idp/
    Domain-Alt=http://localhost:8080/idp-alt/

  3. 创建帐户选择者登录页面。

    要让用户选择要进行身份验证的身份提供商,您必须创建一个帐户选择者登录页面,并将其包含在您的服务提供商中。此页面应包含指向您希望允许其进行身份验证的所有身份供应商的链接。

    accountChooser.html示例

    <html>
      <head>...</head>
      <body>
        <h1>Account Chooser</h1>
        <ul>
          <li><a href="?idp=Domain">Domain</a>
          <li><a href="?idp=Domain-Alt">Domain Alt</a>
        </ul>
      </body>
    </html>

  4. 在 picket link.xml 中配置 IdentityURL 元素。

    您还需要在 picket link.xml 中配置 IdentityURL 元素来引用帐户选择器登录页面。有关为服务提供商配置其余 picketlink.xml 的详情,请参考 设置 SP 部分。

    picket link.xml示例

    <PicketLink xmlns="urn:picketlink:identity-federation:config:2.1">
      <PicketLinkSP xmlns="urn:picketlink:identity-federation:config:2.1" BindingType="REDIRECT">
        <IdentityURL>
          <Provider Page="/accountChooser.html"/>
        </IdentityURL>
        ...
      </PicketLinkSP>
      <Handlers xmlns="urn:picketlink:identity-federation:handler:config:2.1">
        ...
      </Handlers>
    </PicketLink>

    您可以使用 Provider 元素中提供的属性为动态帐户选择器配置附加选项。

    表 2.4. Provider Element Attributes

    选项类型默认值描述

    页面

    字符串

    /accountChooser.html

    用于列出不同 IDP 帐户的 HTML/JSP 页面名称。

    过期

    整数

    -1

    Cookie 到期时间以秒为单位。默认为 -1,这意味着 Cookie 在浏览器关闭时过期。

    DefaultURL

    字符串

     

    默认 IDP 的 URL。

    字符串

     

    发送到用户的浏览器的 cookie 的域名。

    类型

    字符串

     

    用于替换默认实现的 IDP 映射的完全限定实施名称。此实现必须实施 org.picketlink.identity.federation.web.config.IdentityURLConfigurationProvider。默认实施使用 SP Web 应用程序中的 WEB-INF/idpmap.properties 文件。

    重要

    不支持使用 picket link-federation 子系统配置动态帐户选择器。

2.9.4. 处理 AJAX 请求

在某些情况下,SP 可能需要接收对安全资源的 AJAX 请求。这会自动处理,无需任何其他配置,并且使经过身份验证的和获得授权的用户能够进行 AJAX 调用。

这可以通过检查请求中是否存在 X-Requested-With 标头来完成。AJAX 请求由 X- Requested-With 标头中的 XMLHttp Request 值标识。此外,如果用户未经身份验证,并使用 AJAX 向 IDP 和 SP 发送请求,PicketLink 将用 403 HTTP 状态代码而不是登录页面进行响应。





修订到 2022 年 2 月 18:25:38 +1000