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 元素中提供的属性为动态帐户选择器配置附加选项。

    Expand
    表 2.4. Provider Element Attributes
    选项类型默认值描述

    页面

    字符串

    /accountChooser.html

    用于列出不同 IDP 帐户的 HTML/Jakarta 服务器页面名称。

    过期

    整数

    -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 状态代码而不是登录页面进行响应。





更新于 2024-02-09

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部