免责声明:我不太熟悉 Shibboleth 或其他身份验证系统或 AWS Cognito 的工作原理,因此对于任何可以提供帮助的人,请用简单的术语解释一下。
我的公司最近在 AWS 上运行了我们产品的云版本,我们现在希望使用 AWS Cognito 和 SAML 连接到远程 Shibboleth 系统,以对登录我们云系统的用户进行身份验证。 Shibboleth 系统位于客户机构的远程位置。
到目前为止,我已经完成了以下操作(我不知道其中是否正确):
- 在 AWS 中,我创建了 SAML 类型的 IAM 身份提供商。我从客户的 IT 部门收到了一个
SAML.xml
文件,并将其连接到 IAM 身份提供商。这看起来没问题。 - 当我设置 IAM 身份提供商时,AWS 自动创建了 Cognito Auth 和 Unauth Angular 色,我为其保留了默认策略。
- 我为客户机构设置了新的联合身份。我还将创建的 IAM 身份提供商链接到此联合身份。
- 创建联合身份后,我被带到 AWS 中的示例代码页面,我需要在其中选择用于建立连接等的 SDK。我还获得了一个身份池 ID来自AWS。我选择使用 JavaScript SDK,因此我下载了 JS SDK 以及 GitHub 上另一个推荐的库,名为
amazon-cognito-js-master
。 - 我在一个新的 HTML 文件中包含了必要的 JS 脚本,然后将下面的 JS 代码放入该文件中(带有有效的身份池 ID)。
- 当我运行脚本时,我似乎从
console.log
语句中返回了一个有效的syncClient
对象,但从那里,我不知道该怎么做.
基本上,此时我需要做什么才能从 JS 脚本向远程 Shibboleth 系统发出请求以验证用户身份?
在发出 AWS.CognitoSyncManager
请求之前,我是否需要拥有可用的用户凭证(即用户名和密码),或者在此之前是否需要某种程度的初始化?我是否需要客户机构/IT 部门提供其他信息/文件来进行此设置?
我对此知之甚少,我什至不知道该问哪些问题。任何帮助/指导将不胜感激。
请注意,我已经广泛查看了 AWS 文档,但我无法理解他们所说的内容(我不是身份验证专家)。谢谢。
var IdentityPoolId = 'us-east-2:45679821-9064-45f8-12ac-456132abc789'; // Not a real ID.
// Initialize the Amazon Cognito credentials provider
AWS.config.region = 'us-east-2'; // Region
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: IdentityPoolId,
});
// Initialize the Cognito Sync client
AWS.config.credentials.get(function(){
var syncClient = new AWS.CognitoSyncManager();
console.log(syncClient);
syncClient.openOrCreateDataset('myDataset', function(err, dataset) {
dataset.put('myKey', 'myValue', function(err, record){
dataset.synchronize({
onSuccess: function(data, newRecords) {
// Your handler code here
}
});
});
});
});
最佳答案
基本上,此时我需要做什么才能从 JS 脚本向远程 Shibboleth 系统发出请求以验证用户身份?
好吧,你不能。使用联合身份时,您需要编写自己的代码来显示登录 UI 或重定向到 Shibboleth 等第三方 IdP 的登录页面或使用他们的 SDK。最终,您需要编写自己的代码,无需任何 AWS SDK 来获取 OpenID token 或如您的情况,需要 SAML 断言。当您确实获得 token 或 SAML 断言时,请在初始化 CognitoIdentityCredentials 时在登录映射中使用它。请参阅示例 here 。有一个登录字段,您需要传递从 IdP 收到的 token 或断言。现在,只要映射中的 SAML 断言有效,您就可以获得临时 AWS 凭证,并且您的 AWS 调用将会成功。登录映射中的这一行是 Cognito 与您的 Idp 之间的唯一交互,例如使用联合身份时的 Shibboleth。您无法使用用户名和密码直接从 Cognito Federated Identities 调用 Shibboleth 来获取有效的 token 或响应。但是如果我想构建一个需要使用 Shibboleth 进行身份验证的应用程序或服务该怎么办?理想情况下,如果用户未登录,我应该看到一个 UI,它将我重定向到 Shibboleth,在那里我可以输入我的用户名和密码。之后,我应该使用有效的凭据重定向到我的应用程序/服务。
这也可以完成,但使用 Cognito 用户池而不是联合身份。将您的 SAML 提供程序添加到用户池(请参阅 this )。之后,将用户池添加到您的身份池(联合身份)。现在使用 Userpool 的内置 UI 登录并获取 Id token (而不是 SAML 断言,User --> Userpool 内置 UI--> Shibboleth --> 用户名+密码登录 --> Shibboleth 发送 SAML 断言到 Cognito 用户池--> 用户池发出 token )。在您的 CognitoIdentityCredentials 的登录映射中使用此 Id token 。
关于javascript - 如何使用 SAML 将 AWS Cognito 连接到远程 Shibboleth 安装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47720906/