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

如果已启用单点登录( SSO ),则必须发出一系列 API 请求才能从 AD FS 获取对 网格管理 API 或有效的身份验证令牌 租户管理 API

开始之前

  • 您知道属于 StorageGRID 用户组的联合用户的 SSO 用户名和密码。
  • 如果要访问 租户管理 API,您知道租户帐户 ID 。

关于本任务

这只是一个不能保护密码不被其他用户识别的示例工作流。

如果执行速度过慢,此工作流可能会超时。您可能会看到错误: A valid SubjectConfirmation was not found on this response

如果存在 URL 编码问题,您可能会看到错误: 不支持的 SAML 版本

过程

  1. 声明登录所需的变量。
    导出 SAMLUSER='y-sso-username'
    导出 SAMLPASSWORT='y-password'
    导出 SAMLDOMAIN='y-domain'
    导出 TENANTACCOBTID= '12345 '
    导出 STORAGGRID_address='storagegrid.example.com
    导出 AD_FS_address="adfs.example.com
    注: 要访问 网格管理 API,请使用 0 作为 TENANTACCOBTID
  2. 要接收签名身份验证 URL ,请向 /apI/v3/authorize SAML 发出 POST 请求,并从响应中删除额外的 JSON 编码。
    此示例显示 了 TENANTACCOBTID 的已签名身份验证 URL 的 POST 请求。结果将传递到 python -m json.tool 以删除 JSON 编码。
    cURL -X POST "https://$STORAGEGRID_ADDRESS/api/v3/authorize-saml" \
      -H " 接受: application/json" -H " 内容类型: application/json" \
      -data " { \"AccountID" : \"$TENANTACCOBTID\" } " | 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 ,以便在后续命令中使用。
    导出 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" autoscomplete="off" nodvalidate="novalidate" onKeyPres="if ( event & & event.keycode =13 ) Login.submitLoginRequest (); " action="/ADFS/ls/ ?
    SAMLRequest=fZHRToMwifiZfhb...UJikv77sXPw%3d%3d&RelayState=12345&client-request-id=000000000000-0000-0000-ee02-008008008000000000de" >
    
    
  5. 保存响应中的客户端请求 ID 。
    导出 SAMLREQUESTID="0000-0000-0000-ee02-008008000000000DE"
  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
    内容长度: 0
    内容类型: text/html ; charset=UTF-8
    地点: https://adfs.example.com/adfs/ls/?SAMLRequest=fZHRToMwFIZfhb...UJikvo77sXPw%3D%3D&RelayState=12345&client-request-id=00000000-0000-0000-ee02-0080000000de
    Set-Cookie : MSISAuth=AAAAAADAvsHpXk6Apv...pmP0aEiNtJvWY= ; path=/ADFS ; HttpOnly ; Secure
    日期:星期二, 2018 年 11 月 6 日 GMT 16 : 55 : 05
    
  7. 保存 响应中的 MSISAuth Cookie 。
    导出 MSISAuth="AAAAAADAvsHPXk6Apv...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 正常
    cache-Control : no-cache , no-store
    pragma :无缓存
    内容长度: 5665
    内容类型: text/html ; charset=UTF-8
    到期时间: -1
    服务器: microsoft-HTTPAPI/2.0
    P3P : ADFS 没有 P3P 策略,有关详细信息,请联系您站点的管理员
    Set-Cookie : SamlSession=a3dpbnRlcnMtUHJpbWFyeS1BZG1pbi0xNzgmRmFsc2UCNG4NnJDZmFKFxVWx3bkl1MnFuUSUZCUZKQJYMzzJzzzHz1Ez1Ez3MtJYS=JQDQDZKQDZKQDZKQDQJYSQDZKQJQE3MQJKFQDZKF=HQDZKQDZKQDZKQDZKQDZKQDZK
    Set-Cookie : MSISAuthenticated=MTEvNy8yMDE4IDQ6MzI6NTkgUE0= ; path=/ADFS ; HttpOnly ; Secure
    Set-Cookie : MSISLoopDetectionCookie = MjAxOC0xMS0wNzJOZMjo1OVpcM= ; path=/ADFS ; HttpOnly ; Secure
    日期:星期三, 2018 年 11 月 7 日 GMT 16 : 32 : 59
    
    <form method ="post" name="hiddenform" action="https://storagegrid.example.com:443/api/saml-response">
      <input type="hidden" name="SAMLResponse" value="PHNhbWxwOlJlc3Bvbn...1scDpSZXNwb25zZT4="/><input type="hidden" name="RelayState" value="123345" =>
  9. 隐藏字段保存 SAMLResponse :
    导出 SAMLResponse="PHNhbWxwOlJlc3Bvbn...1scDpSZXNwb25zZT4='
  10. 使用保存 的 SAMLResponse发出 StorageGRID/API/SAML 响应 请求以生成 StorageGRID 身份验证令牌。
    对于 RelayState,请使用租户帐户 ID 或如果要登录到 网格管理 API,请使用 0 。
    cURL -X POST "https://$STORAGEGRID_ADDRESS:443/api/saml-response" \
      -H " 接受: application/json" \
      -data-urlencode "SAMLResponse=$SAMLResponse" \
      -data-urlencode "RelayState=$TENANTACCOBTID" \
      我要用 python -m json.tool 来检查
    
    响应包括身份验证令牌。
    {
        "apiVersion" : "3.0" ,
        " 数据 " : "56eb07bf-21f6-40b7-af0b-5c6cacfb25e7" ,
        "ResponseTime" : "2018-11-07T21 : 32 : 53.486Z" ,
        "status": "success"
    }
  11. 将响应中的身份验证令牌保存为 MYTOKEN
    导出 MYTOKEN=56eb07bf-21f6-40b7-af0b-5c6cacfb25e7"
    现在,您可以对 其他请求使用 MYTOKEN ,类似于在未使用 SSO 时使用 API 的方式。