IBM Cloud Docs
SAML

SAML

如果使用基于 SAML 的身份提供商,可以配置 App ID 以启动单点登录(SSO)体验。 在这种流程中,App ID 充当服务提供商,为您的月活跃用户 (MAU) 提供安全令牌。

了解 SAML

安全性断言标记语言 (SAML) 是一个开放式标准,用于在断言身份的提供者和使用身份信息的提供者之间交换认证和授权数据。 SAML 2.0 基于 XML,是一个成熟的身份验证和授权标准框架。

SAML 协议是 App ID(服务提供者)与身份提供者之间的沟通方式。 身份提供商对用户进行身份验证时,会创建 SAML 标记,其中包含用户的相关信息,如验证方式、相关属性或授权参数。 请查看下表中的示例。

了解 SAML 令牌中返回的信息类型
信息类型 示例
认证 用户可以通过密码、使用 MFA 或其他方式进行身份验证。
Attributes 任何属性,例如用户所属的组或某种偏好。
权限决策 有时,授予某个用户的许可权可能多于或少于其他人。

此流程是什么样子的?

虽然 SAML 框架用于认证用户,但 App ID 仍使用更先进的 OIDC 协议与应用程序交换安全性令牌。 请查看下图以了解详细的信息流程。

SAML 企业身份验证流程
企业 SAML 身份验证流程的
原理* SAML 企业身份验证流程的工作原理

  1. 用户访问其应用程序上的登录页面或受限资源,然后通过 App ID SDK 或 API 向 App ID /authorization 端点发起请求。 如果用户未获授权,那么认证流程会首先重定向到 App ID。
  2. App ID 生成 SAML 认证请求 (AuthNRequest),并且浏览器会自动将用户重定向到 SAML 身份提供者。
  3. 身份提供者对 SAML 请求进行解析,对用户进行认证,然后生成包含其断言的 SAML 响应。
  4. 身份提供者通过 SAML 响应将用户和响应重定向回 App ID。
  5. 如果认证成功,App ID 将创建表示用户授权和认证的访问令牌及身份令牌,并将这些令牌返回给应用程序。 如果认证失败,App ID 会向应用程序返回身份提供者错误代码。
  6. 授予用户对应用程序或受保护资源的访问权。

SSO 如何更改流程?

SSO 的工作流程与上述工作流程类似。 唯一的差别在于上一部分中的步骤 3。 启用 SSO 后,在要求用户进行认证之前,身份提供者会先检查用户是否已经建立了认证会话。 如果是,那么不会要求用户进行认证,并且流程照常继续。 如果 SSO 会话不可用,那么会将用户重定向到登录页面。 如果身份提供者无法将 App ID 的请求中定义的认证需求与用于建立 SSO 的认证需求相匹配,那么可能会对用户执行重定向。 例如,如果身份提供者使用生物识别建立了用户 SSO 会话,那么必须更改 App ID 的缺省认证。 缺省情况下,App ID 需要用户使用密码通过 HTTPS 进行认证:urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport

了解断言

SAML 断言返回到 App ID 时,服务会联合用户身份,并生成相应的令牌。 如果 SAML 断言对应于其中一个标准 OIDC 声明,那么会自动将其添加到身份令牌。 缺省情况下,将忽略不匹配的断言。 如果 SAML 提供商返回其他断言,可以配置 App ID,将 信息注入令牌。 但是,请确保除了必要的信息外,不要向令牌添加更多信息,因为令牌通常在 HTTP 头中发送,在大小上有限制。

App ID 尝试映射到断言的标准 OIDC 声明如下:

  • name
  • email
  • locale
  • picture

如果其中一个或多个值在身份提供者端发生更改,那么新值在用户重新登录后可用。

App ID 想要的 SAML 断言是什么样子的?

该服务希望获取类似于以下示例的 SAML 断言。

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="s2202bbbbafa9d270d1c15990b738f4ab36139d463" InResponseTo="_e4a78780-35da-012e-8ea7-0050569200d8" Version="2.0" IssueInstant="2011-03-21T11:22:02Z" Destination="https://example.example.com/">
  <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">idp_entityId</saml:Issuer>
  <samlp:Status xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
    <samlp:StatusCode  xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
  </samlp:Status>
  <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="2.0" ID="pfx539c9774-de5c-5f52-0c3f-b1c2e2697a89" IssueInstant="2018-01-29T13:02:58Z" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
    <saml:Issuer>idp_entityId</saml:Issuer>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
      <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm="one_of_supported_algo"/>
        <ds:SignatureMethod Algorithm="one_of_supported_algo"/>
        <ds:Reference URI="#pfx539c9774-de5c-5f52-0c3f-b1c2e2697a89">
          <ds:Transforms>
            <ds:Transform Algorithm="one_of_supported_algo"/>
            <ds:Transform Algorithm="one_of_supported_algo"/>
          </ds:Transforms>
          <ds:DigestMethod Algorithm="one_of_supported_algo"/>
          <ds:DigestValue>huywDPPfOEGyyzE7d5hjOG97p7FDdGrjoSfes6RB19g=</ds:DigestValue>
        </ds:Reference>
      </ds:SignedInfo>
 <ds:SignatureValue>BAwNZFgWF2oxD1ux0WPfeHnzL+IWYqGhkM9DD28nI9v8XtPN8tqmIb5y4bomaYknmNpWYn7TgNO2Rn/XOq+N9fTZXO2RybaC49iF+zWibRIcNwFKCCpDL6H6jA5eqJX2YKBR+K6Yt2JPoUIRLmqdgm2lMr4Nwq1KYcSzQ/yoV5W0SN/V5t8EfctFoaXVPdtfHVXkwqHeufo+L4gobFt9NRTzXB0SQEClA1L8hQ+/LhY4l46k1D0c34iWjVLZr+ecQyubf7rekOG/R7DjWCFMTke822dR+eJTPWFsHGSPWCDDHFYqB4QMinTvUnsngjY3AssPqIOjeUxjL3p+GXn8IQ==</ds:SignatureValue>
    </ds:Signature>
    <saml:Subject>
      <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">JohnDoe@gmail.com</saml:NameID>
    </saml:Subject>
    <saml:Conditions NotBefore="2018-01-29T12:59:58Z" NotOnOrAfter="2018-01-29T13:05:58Z">
    </saml:Conditions>
</samlp:Response>

App ID 支持哪些类型的算法?

App ID 使用 RSA-SHA256 算法来处理 XML 数字签名。

配置 SAML 身份提供者以使用 App ID

通过将 App ID 的元数据提供给身份提供商,以及将身份提供商的元数据提供给 App ID,可以配置 SAML 身份提供商与 App ID 协同工作。

为身份提供者提供元数据

要配置应用程序,需要向与 SAML 兼容的身份提供者提供信息。 通过元数据 XML 文件交换信息,该 XML 文件还包含用于建立信任的配置数据。

将 SAML 配置为身份提供程序后,才能启用它。

  1. 在 App ID 仪表板的管理选项卡中,单击 SAML 行中的编辑以配置设置。

  2. 单击下载 SAML 元数据文件。 您的身份提供者希望该文件提供以下信息。

    元数据文件中的信息
    变量 描述
    EntityID 让身份提供者知道 App ID 已发出 SAML 请求的标识符。
    Location URL 身份提供者在成功认证用户后发送 SAML 断言的位置。
    Binding 身份提供者必须如何发送 SAML 响应的说明。
    NameID Format 身份供应商如何知道需要在断言主题中发送哪种标识符格式,以及 App ID 如何识别用户。 标识必须采用以下格式: &lt;saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"&gt;
    WantAssertionsSigned 身份提供者检查是否需要签署声明的方式。 该服务需要签署断言,但不支持已加密的断言。
    KeyDescriptor SAML 签名证书和加密证书,可用于配置身份提供者以验证签名的 SAML 请求并加密响应。
  3. 向身份提供者提供数据。 如果身份提供者支持上传元数据文件,那么您可以执行此操作。 否则,请手动配置属性。 并非每个身份提供者都使用相同的属性,因此,您可能不会使用所有这些属性。

    针对不同的身份提供者,属性名可能有所不同。

  4. SAML 2.0 联合切换为已启用

向 App ID 提供元数据

您可以从身份提供者那里获取数据,然后将其提供给 App ID。 您可以从 IBM Cloud 或身份提供者启动应用程序登录。

在控制台中提供元数据

要从 IBM Cloud UI 登录到应用程序,请执行以下步骤。

  1. 导航至 App ID 仪表板的 SAML 2.0 选项卡。

  2. 添加 提供者名称。 缺省名称为 SAML。

  3. 提供来自 SAML IdP 的元数据部分中,输入您从身份提供者获取的以下元数据。

    必须提供给App ID的信息
    变量 描述
    Sign-in URL 为了进行认证而将用户重定向到的 URL。 它由 SAML 身份提供者托管。
    Entity ID SAML 身份提供者的全局唯一名称。
    Primary certificate SAML 身份提供者发放的证书。 用于签署和验证 SAML 断言。 所有提供者都不同,但您可能可以下载身份提供者的签名证书。 证书格式必须为 .pem
  4. 可选:提供在主证书上签名验证失败时使用的辅助证书。 如果签名密钥保持不变,那么 App ID 不会阻止对到期证书进行认证。

  5. 单击保存

要设置认证上下文? 您可以通过 API 来执行此操作。

在控制台配置 IdP-initiated 登录

如果您想从身份提供商的用户界面登录IBM Cloud上的应用程序,可以选择启用IdP-initiated登录。

按照“在控制台中提供元数据”部分中的步骤 1-4 进行操作。 然后,完成以下流程。

  1. 启用 IdP 启动的登录
  2. 输入 IdP 重定向 URL
  3. 单击保存

使用应用程序接口提供元数据

  1. /saml API 端点发出 GET 请求,查看当前的 SAML 配置,包括身份验证上下文和证书。

    示例代码:

    curl --request GET \
    https://us-south.appid.cloud.ibm.com/management/v4/<tenantID>/config/idps/saml \
    --header `Accept: application/json`
    

    示例输出:

    {
       "isActive": true,
       "config": {
       "entityID": "https://example.com/saml2/metadata/706634",
       "signInUrl": "https://example.com/saml2/sso-redirect/706634",
       "certificates": [
          "certificate-example-pem-format"
       ],
       "displayName": "my saml example",
       "authnContext": {
          "class": [
             "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"
          ],
          "comparison": "exact"
       }
       }
    }
    
  2. 通过将以下示例中的值替换为提供者中的信息,以创建 SAML 配置。 示例中显示的值为必填值,但您也可以选择包含表中显示的更多信息。

    "config": {
       "authnContext": {
       "class": [
          "urn:oasis:names:tc:SAML:2.0:ac:classes:YourChosenClassValue",
          "urn:oasis:names:tc:SAML:2.0:ac:classes:YourOtherChosenClassValue"
       ],
       "comparison": "sampleComparisonValue"}
       "entityID": "https://example.com/saml2/metadata/706634",
       "signInUrl": "https://example.com/saml2/sso-redirect/706634",
       "certificates": [
       "primary-certificate-example-pem-format"
       "secondary-certificate-example-pem-format"
       ],
       "displayName": "my saml example",
       "signRequest": true ,
       "encryptResponse": true
    }
    
    SAML 配置变量
    变量 描述
    signInUrl 为了进行认证而将用户重定向到的 URL。 它由 SAML 身份提供者托管。
    entityID SAML 身份提供者的全局唯一名称。
    displayName 为 SAML 配置指定的名称。
    primary-certificate-example-pem-format SAML 身份提供者发放的证书。 用于签署和验证 SAML 断言。 所有提供者都不同,但您可能可以下载身份提供者的签名证书。 证书格式必须为 .pem
    可选:secondary-certificate-example-pem-format 由 SAML 身份提供商签发的备份证书。 如果使用主证书进行签名验证失败,那么会使用备份证书。 注意:如果签名密钥保持不变,App ID 不会阻止对过期证书的验证。
    可选:authnContext 认证上下文用于验证认证和 SAML 断言的质量。 可以通过向代码添加类数组和比较字符串来添加认证上下文。 确保使用您的值来更新 classcomparison 参数。 例如,class 参数可能与 urn:oasis:names:tc:SAML:2.0:ac:classes:YourChosenClassValue 类似。
    可选:signRequest signRequest 标志提供了向身份提供商发送已签名 SAML 请求的功能,该请求使用租户的 SAML 签名私钥签名。 要配置 SAML 身份提供程序以接收签名请求,需要元数据文件中的签名证书,可在 KeyDescriptor use="signing" 字段中下载。 缺省情况下,请求签名设置为 off
    可选:encryptResponse encryptResponse 标志允许您从身份供应商处接收加密响应,作为身份验证请求的一部分。 要配置 SAML 身份提供程序以发送加密响应,需要使用加密证书,该证书可在 KeyDescriptor use="encryption" 字段的元数据文件中找到。 缺省情况下,响应加密设置为 off
  3. /saml API 端点发出 PUT 请求,向 App ID 提供在步骤 2 中创建的配置。 请查看以下示例以了解请求可能会是什么样子。

    curl --request PUT \
    https://us-south.appid.cloud.ibm.com/management/v4/<tenantID>/config/idps/saml \
    --header `Accept: application/json` \
    --data \
    {
       "isActive": true,
       "config": {
       "entityID": "https://example.com/saml2/metadata/706634",
       "signInUrl": "https://example.com/saml2/sso-redirect/706634",
       "certificates": [
          "primary-certificate-example-pem-format"
       ],
       "displayName": "my saml example",
       }
    }
    

使用应用程序接口配置IdP-initiated登录

要配置 IdP-initiated 登录,请完成以下步骤。

  1. /saml API 端点发出 GET 请求,查看当前的 SAML 配置,包括身份验证上下文和证书。

    示例代码:

    curl --request GET \
    https://us-south.appid.cloud.ibm.com/management/v4/<tenantID>/config/idps/saml \
    --header `Accept: application/json`
    

    示例输出:

    {
       "isActive": true,
       "config": {
       "entityID": "https://example.com/saml2/metadata/706634",
       "signInUrl": "https://example.com/saml2/sso-redirect/706634",
       "certificates": [
          "certificate-example-pem-format"
       ],
       "displayName": "my saml example",
       "authnContext": {
          "class": [
             "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"
          ],
          "comparison": "exact"
       }
       }
    }
    
  2. 通过将以下示例中的值替换为提供者中的信息,以创建 SAML 配置。 示例中显示的值为必填值,但您也可以选择包含表中显示的更多信息。

    "config": {
       "authnContext": {
       "class": [
          "urn:oasis:names:tc:SAML:2.0:ac:classes:YourChosenClassValue",
          "urn:oasis:names:tc:SAML:2.0:ac:classes:YourOtherChosenClassValue"
       ],
       "comparison": "sampleComparisonValue"
       },
       "idpInitEnabled": true,
       "idpRedirectUrl": "https://example.com/redirect/endpoint",
       "entityID": "https://example.com/saml2/metadata/706634",
       "signInUrl": "https://example.com/saml2/sso-redirect/706634",
       "certificates": [
       "primary-certificate-example-pem-format"
       "secondary-certificate-example-pem-format"
       ],
       "displayName": "my saml example",
       "signRequest": true ,
       "encryptResponse": true
    }
    
    SAML 配置变量
    变量 描述
    signInUrl 为了进行认证而将用户重定向到的 URL。 它由 SAML 身份提供者托管。
    entityID SAML 身份提供者的全局唯一名称。
    displayName 为 SAML 配置指定的名称。
    primary-certificate-example-pem-format SAML 身份提供者发放的证书。 用于签署和验证 SAML 断言。 所有提供者都不同,但您可能可以下载身份提供者的签名证书。 证书格式必须为 .pem
    DefaultRelayState RelayState 的初始值。 此变量是在身份提供者的设置中配置的。 在身份提供商发出 SAML 请求时,该变量可用于重定向 URL,而不是 idpRedirectUrl。 如果设置这两个变量,那么 DefaultRelayState 的值优先。 如果不设置其中一个变量,IdP-initiated登录就会失败。
    idpInitEnabled 一个布尔值,用于指示是否要启用 IdP 启动的登录。
    idpRedirectUrl 该字段的值可以是 null、空字符串或有效的 http 或 https 重定向 URL。 注意:如果该字段的值为空,则必须将 DefaultRelayState 设置为重定向 URL。 如果设置这两个变量,那么 DefaultRelayState 的值优先。 如果不设置其中一个变量,IdP-initiated登录就会失败。
    可选:secondary-certificate-example-pem-format 由 SAML 身份提供商签发的备份证书。 如果使用主证书进行签名验证失败,那么会使用备份证书。 注意:如果签名密钥保持不变,App ID 不会阻止对过期证书的验证。
    可选:authnContext 认证上下文用于验证认证和 SAML 断言的质量。 可以通过向代码添加类数组和比较字符串来添加认证上下文。 确保使用您的值来更新 classcomparison 参数。 例如,class 参数可能与 urn:oasis:names:tc:SAML:2.0:ac:classes:YourChosenClassValue 类似。
    可选:signRequest signRequest 标志提供了向身份提供商发送已签名 SAML 请求的功能,该请求使用租户的 SAML 签名私钥签名。 要配置 SAML 身份提供程序以接收签名请求,需要元数据文件中的签名证书,可在 KeyDescriptor use="signing" 字段中下载。 缺省情况下,请求签名设置为 off
    可选:encryptResponse encryptResponse 标志允许您从身份供应商处接收加密响应,作为身份验证请求的一部分。 要配置 SAML 身份提供程序以发送加密响应,需要使用加密证书,该证书可在 KeyDescriptor use="encryption" 字段的元数据文件中找到。 缺省情况下,响应加密设置为 off
  3. /saml API 端点发出 PUT 请求,向 App ID 提供在步骤 2 中创建的配置。 请查看以下示例以了解请求可能会是什么样子。

    curl --request PUT \
    https://us-south.appid.cloud.ibm.com/management/v4/<tenantID>/config/idps/saml \
    --header `Accept: application/json` \
    --data \
       {
         "isActive": true,
         "config": {
             "entityID": "https://example.com/saml2/metadata/706634",
             "signInUrl": "https://example.com/saml2/sso-redirect/706634",
             "certificates": [
             "certificate-example-pem-format"
             ],
             "displayName": "my saml example",
             "authnContext": {
                 "class": [
                     "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"
                 ],
             "comparison": "exact"
             },
             "idpInitEnabled": true,
             "idpRedirectUrl": "https://example.com/redirect/endpoint",
         }
    }
    

测试您的配置

您可以在 SAML 身份提供者与 App ID 之间测试配置。

  1. 确保保存了配置。
  2. 导航至 App ID 仪表板的 SAML 2.0 选项卡,并单击测试。 这样会打开一个新选项卡。
  3. 使用身份提供商已认证的用户登录。
  4. 完成表单后,会将您重定向到其他页面。
    • 认证成功:App ID 与身份提供者之间的连接正常运作。 此页面显示有效的访问令牌和身份令牌
    • 认证失败:连接已中断。 此页面显示错误和 SAML 响应 XML 文件。

SAML 框架支持多个概要文件,流和配置,这意味着必须正确配置身份提供者。 如果迂到问题,请查看 认证请求可能失败 的一些常见原因,或者查看 SAML 规范 以获取详细的错误代码。