

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Connect 客户对 SAML 进行故障排除
<a name="troubleshoot-saml"></a>

本文介绍如何排除和解决客户在将 SAML 与 Connect Customer 配合使用时遇到的一些最常见的问题。

如果您要对与其他身份提供商（例如 Okta、 PingIdentify、Azure AD 等）的集成进行故障排除，请参阅 [Connect 客户 SSO 安装研讨会](https://catalog.workshops.aws/workshops/33e6d0e7-f927-4531-abb1-f28a86ba0872/en-US)。

## 错误消息：访问被拒绝。您的账户已经过身份验证，但尚未登入此应用程序。
<a name="troubleshoot-saml-access-denied"></a>

![错误消息：访问被拒绝。](http://docs.aws.amazon.com/zh_cn/connect/latest/adminguide/images/saml-troubleshooting-access-denied.png)


### 这意味着什么？
<a name="troubleshoot-saml-access-denied-what"></a>

此错误表示用户已使用 SAML 成功向 AWS SAML 登录端点进行身份验证。但是，用户不能在 Connect Customer matched/found 内部。此消息通常提示出现以下问题之一：
+ Connect Customer 中的用户名与身份提供者返回的 `RoleSessionName` SAML 响应中指定的 SAML 属性不匹配。
+ 该用户在 Connect Customer 中不存在。
+ 通过 SSO 为用户分配了两个单独的配置文件。

### 解决方案
<a name="troubleshoot-saml-access-denied-resolution"></a>

使用以下步骤检查身份提供者返回的 RoleSessionName SAML 响应中指定的 SAML 属性，然后检索登录名并将其与 Connect Customer 中的登录名进行比较。

1. 为端到端登录过程执行 HAR 捕获 (**H**TTP **AR**chive)。这将从浏览器端捕获网络请求。使用首选文件名保存 HAR 文件，例如 **saml.har**。

   有关说明，请参阅[如何通过浏览器为 Support 案例创建 HAR 文件？ AWS](https://aws.amazon.com/premiumsupport/knowledge-center/support-case-browser-har-file/) 

1. 使用文本编辑器在 HAR 文件中查找 SAML 响应。或者，运行以下命令：

   `$ grep -o "SAMLResponse=.*&" azuresaml.har | sed -E 's/SAMLResponse=(.*)&/\1/' > samlresponse.txt`
   + 这将在 HAR 文件中搜索 SAML 响应，并将其保存到 **samlresponse.txt** 文件中。
   + 响应采用 URL 编码，而内容采用 Base64 编码。

1. 对 URL 响应进行解码，然后使用第三方工具或简单脚本解码 Base64 内容。例如：

   `$ cat samlresponse.txt | python3 -c "import sys; from urllib.parse import unquote; print(unquote(sys.stdin.read()));" | base64 --decode > samlresponsedecoded.txt`

   此脚本使用简单的 python 命令从原始 URL 编码格式解码 SAMLResponse。然后，它解码来自 Base64 的响应，并以纯文本格式输出 SAML 响应。

1. 检查所需属性的解码响应。例如，下图显示如何检查 `RoleSessionName`：  
![用于检查 rolesessionname 的 grep 命令。](http://docs.aws.amazon.com/zh_cn/connect/latest/adminguide/images/saml-troubleshooting-rolesessionname.png)

1. 检查上一步中返回的用户名是否作为用户存在于您的 Connect Customer 实例中：

   $ aws connect list-users --instance-id [INSTANCE\_ID] \| grep $username
   + 如果最终的 grep 没有返回结果，则表示该用户不存在于您的 Connect Customer 实例中，或者该用户是使用不同的 case/capitalization实例创建的。
   + 如果您的 Connect Customer 实例有许多用户，那么 ListUsers API 调用的响应可能会分页。使用由此 API 返回的 `NextToken` 获取其余用户。有关更多信息，请参阅 [ListUsers](https://docs.aws.amazon.com/connect/latest/APIReference/API_ListUsers.html)。

### 示例 SAML 响应
<a name="example-samlresponse"></a>

以下是示例 SAML 响应中的图像。在这种情况下，身份提供程序 (IdP) 是 Azure Active Directory (Azure AD)。

![SAML 响应示例。](http://docs.aws.amazon.com/zh_cn/connect/latest/adminguide/images/saml-troubleshooting-saml-response.png)


## 错误消息：访问被拒绝，请联系您的 AWS 账户管理员寻求帮助。
<a name="troubleshoot-saml-contact-admin"></a>

![错误消息：访问被拒绝。](http://docs.aws.amazon.com/zh_cn/connect/latest/adminguide/images/saml-troubleshooting-access-denied-admin.png)


### 这意味着什么？
<a name="troubleshoot-saml-bad-request-what"></a>

已使用 SAML 成功对用户所代入的角色进行身份验证。但是，该角色无权调用 Connect Cu GetFederationToken stomer 的 API。此调用是必需的，这样用户才能使用 SAML 登录您的 Connect Customer 实例。

### 解决方案
<a name="troubleshoot-saml-bad-request-resolution"></a>

1. 将具有 `connect:GetFederationToken` 的权限的策略附加到在错误消息中找到的角色。以下是策略示例：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "Statement1",
               "Effect": "Allow",
               "Action": "connect:GetFederationToken",
               "Resource": [
                   "arn:aws:connect:ap-southeast-2:{{111122223333}}:instance/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/user/${aws:userid}"
               ]
           }
       ]
   }
   ```

------

1. 使用 IAM 控制台附加策略。或者，使用 attach-role-policy API，例如：

   `$ aws iam attach-role-policy —role-name [{{ASSUMED_ROLE}}] —policy_arn [{{POLICY_WITH_GETFEDERATIONTOKEN}}]`

## 错误消息：会话已过期
<a name="saml-sessionexpired-message"></a>

如果您在登录时看到**会话已过期**消息，则可能只需要刷新会话令牌即可。访问您的身份提供商并登录。刷新 Connect 客户页面。如果您仍然收到此消息，请联系您的 IT 团队。