带有 ADFS 的 AWS Cognito:颁发者与 providerName 不匹配

Posted

技术标签:

【中文标题】带有 ADFS 的 AWS Cognito:颁发者与 providerName 不匹配【英文标题】:AWS Cognito with ADFS: Issuer doesn't match providerName 【发布时间】:2020-09-21 10:35:54 【问题描述】:

我正在尝试在无服务器 lambda 中设置 AWS.config.credentials(在 REST 端点中运行)。登录来自使用 ADFS 作为联合身份的 Cognito 用户池。我还有一个 Cognito Identlty Pool。

我的 lambda 处理程序具有如下事件、上下文和回调参数:

export.handler =(事件,上下文,回调) ...

event.headers.Authorization 有一个有效的 JWT(来自 id_token),当 html 客户端对 REST 端点执行 POST 调用时,该 JWT 被放置在 Authorization 标头中。我在这里自己验证了 JWT:https://jwt.io。此外,context.authorizer 对象看起来也是有效的,表明我已登录,它包含我的电子邮件和用户名信息以及有效的发行和到期日期。简而言之,我很确定我有一个有效的登录。

但是当我尝试执行以下命令时,我收到一条错误消息“NotAuthorizedException: Invalid login token. Issuer doesn't match providerName”

AWS.config.credentials = 新 AWS.CognitoIdentityCredentials( IdentityPoolId: 'us-east-1:my-identity-pool-id', 登录: “cognito-idp:us-east-1.amazonaws.com/us-east-1_myUserPoolId”:event.headers.Authorization ); AWS.config.credentials.get(err => 如果(!错误) var id = AWS.config.credentials.identityId; console.log('Cognito 身份 ID '+ id); 别的 console.log('cred error: ', err); );

当然,my-identity-pool-id 和 myUserPoolId 被替换为它们的实际值。我已经看到有关此主题的许多其他帖子表明错误地制定了 Logins 对象会产生此错误,但我在这段代码中已经经历了几次 - 并且让其他人也为我检查了它。我不认为我弄错了那部分。就错误文本而言,它实际上是正确的。如果我查看我解码的 JWT,issuer 和 providerName 是不同的:

"at_hash": "pciSj0Hcjk1Pp9noJIj4GQ", “子”:“e41500b1-d987-49be-81c0-8fbc36a59ce1”, “email_verified”:假, "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxx", “cognito:用户名”:“ge2cadmin2-saml-idp_ravi”, “认知:角色”:[ “我的幻想角色” ], "aud": "7r7v0ren5fm3m6vmjgj6nasr79", “身份”:[ "userId": "ravi", "providerName": "ge2cadmin2-saml-idp", "providerType": "SAML", "发行人": "http://adfs.careevolution.com/adfs/services/trust", “主要”:“真实”, “创建日期”:“1590770196859” ], "token_use": "id", “auth_time”:1591118267, “exp”:1591126227, “iat”:1591122627, “电子邮件”:“ravi@careevolution.com”

如您所见,在 identities[] 部分中,发行者是http://adfs.careevolution.com/adfs/services/trust,提供者名称是 ge2cadmin2-saml-idp。但我认为在这种情况下,这是可以预料的。但是,如果问题确实是这种差异(而不是其他地方的一些错误配置),我该如何设置,以便 AWS.CognitoIdentityCredentials 在发行者与 providerName 不同的情况下可以?

【问题讨论】:

【参考方案1】:

答案很简单。魔术字符串:“cognito-idp:us-east-1.amazonaws.com/us-east-1_myUserPoolId”不正确。相反,我应该使用:“cognito-idp.us-east-1.amazonaws.com/us-east-1_myUserPoolId”(在 cognito-idp 后面加一个点而不是冒号)。虽然错误消息很糟糕且具有误导性,但该错误被证明是简单的用户错误。

我在此处发布此内容是为了帮助任何来搜索相同误导性错误消息的人。

【讨论】:

遇到了完全相同的问题,它让我发疯了,因为它在具有相同设置的另一个环境中工作(减去复制/粘贴错误)-谢谢!

以上是关于带有 ADFS 的 AWS Cognito:颁发者与 providerName 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何使用适用于AWS Cognito的AD FS SAML?

如何继续使用适用于 AWS Cognito 的 AD FS SAML?

AWS Cognito 如何验证我自己的 IdP 颁发的身份令牌?

尝试使用 Cognito 向 Battle.net OIDC 进行身份验证时出现错误的 id_token 颁发者

MSIS0037:未找到颁发者的签名验证证书

如何将 AD FS 组成员身份映射到自定义 AWS Cognito 属性?