Skip to main content
本产品推出了新版本。
简体中文版经机器翻译而成,仅供参考。如与英语版出现任何冲突,应以英语版为准。

如果已启用单一登录,请使用 StorageGRID API(Active Directory)

如果已启用 "已配置并启用单点登录(SSO)" 并将 Active Directory 用作 SSO 提供程序,则必须发出一系列 API 请求,以获取对网格管理 API 或租户管理 API 有效的身份验证令牌。

如果启用了单点登录,请登录到 API

如果您使用 Active Directory 作为 SSO 身份提供程序,则适用以下说明。

开始之前
  • 您知道属于 StorageGRID 用户组的联合用户的 SSO 用户名和密码。

  • 如果要访问租户管理 API,则需要知道租户帐户 ID。

关于此任务

可以使用以下示例之一获取身份验证令牌:

  • storagegrid-ssoauth.py Python 脚本位于 StorageGRID 安装文件目录中(RHEL 为(./rpms./debs 适用于 Ubuntu 或 Debian,VMware 为 ./vsphere)。

  • curl 请求的示例工作流。

    如果执行太慢,curl 工作流可能会超时。您可能会看到以下错误: A valid SubjectConfirmation was not found on this Response

    备注 示例 curl 工作流程不会保护密码免遭其他用户查看。

如果您遇到 URL 编码问题,则可能会看到错误: Unsupported SAML version

步骤
  1. 选择以下方法之一以获取身份验证令牌:

    • 使用 storagegrid-ssoauth.py Python 脚本。转至第 2 步。

    • 使用 curl 请求。转到步骤 3。

  2. 如果要使用 `storagegrid-ssoauth.py`脚本,请将脚本传递给 Python 解释器并运行脚本。

    出现提示时,请输入以下参数的值:

    • SSO 方法。输入 ADFS 或 adfs。

    • SSO 用户名

    • 安装 StorageGRID 的域

    • StorageGRID 的地址

    • 租户帐户 ID(如果要访问租户管理 API)。

      AD FS 的 SSO 身份验证脚本

    StorageGRID 授权令牌在输出中提供。您现在可以将令牌用于其他请求,类似于在未使用 SSO 的情况下使用 API 的方式。

  3. 如果要使用 curl 请求,请使用以下过程。

    1. 声明登录所需的变量。

      export SAMLUSER='my-sso-username'
      export SAMLPASSWORD='my-password'
      export SAMLDOMAIN='my-domain'
      export TENANTACCOUNTID='12345'
      export STORAGEGRID_ADDRESS='storagegrid.example.com'
      export AD_FS_ADDRESS='adfs.example.com'
      备注 要访问 Grid Management API,请使用 0 作为 TENANTACCOUNTID
    2. 若要接收已签名的身份验证 URL,请向 `/api/v3/authorize-saml`发出 POST 请求,并从响应中删除其他 JSON 编码。

      此示例显示了针对 `TENANTACCOUNTID`的已签名身份验证 URL 的 POST 请求。结果将传递给 `python -m json.tool`以删除 JSON 编码。

      curl -X POST "https://$STORAGEGRID_ADDRESS/api/v3/authorize-saml" \
        -H "accept: application/json" -H  "Content-Type: application/json" \
        --data "{\"accountId\": \"$TENANTACCOUNTID\"}" | python -m json.tool

      此示例的响应包括经过 URL 编码的签名 URL,但不包括附加的 JSON 编码层。

      {
          "apiVersion": "3.0",
          "data": "https://adfs.example.com/adfs/ls/?SAMLRequest=fZHLbsIwEEV%2FJTuv7...sSl%2BfQ33cvfwA%3D&RelayState=12345",
          "responseTime": "2018-11-06T16:30:23.355Z",
          "status": "success"
      }
    3. 从响应中保存 SAMLRequest,以便在后续命令中使用。

      export SAMLREQUEST='fZHLbsIwEEV%2FJTuv7...sSl%2BfQ33cvfwA%3D'
    4. 从 AD FS 获取包含客户端请求 ID 的完整 URL。

      一种选择是使用上一个响应中的 URL 请求登录表单。

      curl "https://$AD_FS_ADDRESS/adfs/ls/?SAMLRequest=$SAMLREQUEST&RelayState=$TENANTACCOUNTID" | grep 'form method="post" id="loginForm"'

      响应包括客户端请求 ID:

      <form method="post" id="loginForm" autocomplete="off" novalidate="novalidate" onKeyPress="if (event && event.keyCode == 13) Login.submitLoginRequest();" action="/adfs/ls/?
      SAMLRequest=fZHRToMwFIZfhb...UJikvo77sXPw%3D%3D&RelayState=12345&client-request-id=00000000-0000-0000-ee02-0080000000de" >
    5. 从响应中保存客户端请求 ID。

      export SAMLREQUESTID='00000000-0000-0000-ee02-0080000000de'
    6. 将您的凭据发送到上一个响应的表单操作。

      curl -X POST "https://$AD_FS_ADDRESS/adfs/ls/?SAMLRequest=$SAMLREQUEST&RelayState=$TENANTACCOUNTID&client-request-id=$SAMLREQUESTID" \
      --data "UserName=$SAMLUSER@$SAMLDOMAIN&Password=$SAMLPASSWORD&AuthMethod=FormsAuthentication" --include

      AD FS返回302重定向,标头中包含其他信息。

      备注 如果您的 SSO 系统启用了多因素身份验证 (MFA),表单提交内容中也会包含第二个密码或其他凭据。
      HTTP/1.1 302 Found
      Content-Length: 0
      Content-Type: text/html; charset=utf-8
      Location: https://adfs.example.com/adfs/ls/?SAMLRequest=fZHRToMwFIZfhb...UJikvo77sXPw%3D%3D&RelayState=12345&client-request-id=00000000-0000-0000-ee02-0080000000de
      Set-Cookie: MSISAuth=AAEAADAvsHpXk6ApV...pmP0aEiNtJvWY=; path=/adfs; HttpOnly; Secure
      Date: Tue, 06 Nov 2018 16:55:05 GMT
    7. 从响应中保存 MSISAuth Cookie。

      export MSISAuth='AAEAADAvsHpXk6ApV...pmP0aEiNtJvWY='
    8. 使用来自身份验证 POST 的 Cookie 将 GET 请求发送到指定位置。

      curl "https://$AD_FS_ADDRESS/adfs/ls/?SAMLRequest=$SAMLREQUEST&RelayState=$TENANTACCOUNTID&client-request-id=$SAMLREQUESTID" \
      --cookie "MSISAuth=$MSISAuth" --include

      响应标头将包含 AD FS 会话信息,以供以后注销使用,响应正文在隐藏表单字段中包含 SAMLResponse。

      HTTP/1.1 200 OK
      Cache-Control: no-cache,no-store
      Pragma: no-cache
      Content-Length: 5665
      Content-Type: text/html; charset=utf-8
      Expires: -1
      Server: Microsoft-HTTPAPI/2.0
      P3P: ADFS doesn't have P3P policy, please contact your site's admin for more details
      Set-Cookie: SamlSession=a3dpbnRlcnMtUHJpbWFyeS1BZG1pbi0xNzgmRmFsc2Umcng4NnJDZmFKVXFxVWx3bkl1MnFuUSUzZCUzZCYmJiYmXzE3MjAyZTA5LThmMDgtNDRkZC04Yzg5LTQ3NDUxYzA3ZjkzYw==; path=/adfs; HttpOnly; Secure
      Set-Cookie: MSISAuthenticated=MTEvNy8yMDE4IDQ6MzI6NTkgUE0=; path=/adfs; HttpOnly; Secure
      Set-Cookie: MSISLoopDetectionCookie=MjAxOC0xMS0wNzoxNjozMjo1OVpcMQ==; path=/adfs; HttpOnly; Secure
      Date: Wed, 07 Nov 2018 16:32:59 GMT
      
      <form method="POST" name="hiddenform" action="https://storagegrid.example.com:443/api/saml-response">
        <input type="hidden" name="SAMLResponse" value="PHNhbWxwOlJlc3BvbnN...1scDpSZXNwb25zZT4=" /><input type="hidden" name="RelayState" value="12345" />
    9. 从隐藏字段中保存 SAMLResponse

      export SAMLResponse='PHNhbWxwOlJlc3BvbnN...1scDpSZXNwb25zZT4='
    10. 使用保存的 SAMLResponse,发出 StorageGRID/api/saml-response 请求以生成 StorageGRID 身份验证令牌。

      对于 RelayState,请使用租户帐户 ID,或者如果要登录到 Grid Management API,请使用 0。

      curl -X POST "https://$STORAGEGRID_ADDRESS:443/api/saml-response" \
        -H "accept: application/json" \
        --data-urlencode "SAMLResponse=$SAMLResponse" \
        --data-urlencode "RelayState=$TENANTACCOUNTID" \
        | python -m json.tool

      响应包括身份验证令牌。

    {
        "apiVersion": "3.0",
        "data": "56eb07bf-21f6-40b7-af0b-5c6cacfb25e7",
        "responseTime": "2018-11-07T21:32:53.486Z",
        "status": "success"
    }
    1. 将响应中的身份验证令牌另存为 MYTOKEN

      export MYTOKEN="56eb07bf-21f6-40b7-af0b-5c6cacfb25e7"

      现在,您可以将 `MYTOKEN`用于其他请求,类似于在未使用 SSO 的情况下使用 API 的方式。

如果已启用单一登录,则注销 API

如果已启用单点登录 (SSO),则必须发出一系列 API 请求以注销网格管理 API 或租户管理 API。如果您将 Active Directory 用作 SSO 身份提供程序,则适用以下说明

关于此任务

如果需要,您可以通过从组织的单点注销页面注销来退出 StorageGRID API。或者,您可以从 StorageGRID 触发单点注销 (SLO),这需要有效的 StorageGRID 承载令牌。

步骤
  1. 要生成已签名的注销请求,请将 cookie "sso=true" 传递给 SLO API:

    curl -k -X DELETE "https://$STORAGEGRID_ADDRESS/api/v3/authorize" \
    -H "accept: application/json" \
    -H "Authorization: Bearer $MYTOKEN" \
    --cookie "sso=true" \
    | python -m json.tool

    返回注销 URL:

    {
        "apiVersion": "3.0",
        "data": "https://adfs.example.com/adfs/ls/?SAMLRequest=fZDNboMwEIRfhZ...HcQ%3D%3D",
        "responseTime": "2018-11-20T22:20:30.839Z",
        "status": "success"
    }
  2. 保存注销 URL。

    export LOGOUT_REQUEST='https://adfs.example.com/adfs/ls/?SAMLRequest=fZDNboMwEIRfhZ...HcQ%3D%3D'
  3. 向注销 URL 发送请求以触发 SLO 并重定向回 StorageGRID。

    curl --include "$LOGOUT_REQUEST"

    返回 302 响应。重定向位置不适用于仅限 API 的注销。

    HTTP/1.1 302 Found
    Location: https://$STORAGEGRID_ADDRESS:443/api/saml-logout?SAMLResponse=fVLLasMwEPwVo7ss%...%23rsa-sha256
    Set-Cookie: MSISSignoutProtocol=U2FtbA==; expires=Tue, 20 Nov 2018 22:35:03 GMT; path=/adfs; HttpOnly; Secure
  4. 删除 StorageGRID 承载令牌。

    删除 StorageGRID 承载令牌的工作方式与没有 SSO 的工作方式相同。如果未提供 `cookie "sso=true",则用户将从 StorageGRID 注销,而不会影响 SSO 状态。

    curl -X DELETE "https://$STORAGEGRID_ADDRESS/api/v3/authorize" \
    -H "accept: application/json" \
    -H "Authorization: Bearer $MYTOKEN" \
    --include

    A 204 No Content 响应表示用户现已注销。

    HTTP/1.1 204 No Content