我正在做一个 AWS 项目。我们希望能够颁发具有有限权限的 STS 临时安全凭证,以便访问 AWS 服务。我们正在使用 C# 在 .Net Core 中工作。
我们使用 STS来生成这些凭证AssumeRoleAsync()
,这是 .Net SDK 使用 AWS AssumeRole操作的方法。调用的响应AssumeRoleAsync()
是一个AssumeRoleResponse
对象,它由一个AssumeRoleUser
对象和一个Credentials
对象组成。的属性之一AssumedRoleUser
是AssumedRoleId
,其形式为role-id:role-session-name
。
我们有一个Lambda 函数,它以 JSON 对象的形式处理调用AssumeRoleAsync
和返回生成的凭证。该 Lambda 函数通过API Gateway方法调用。
所有这些工作正常。以上只是为了布景。
我们希望能够做的下一件事是使用 STS 临时凭证对 AWS 服务进行其他调用。发生这种情况时,我们希望能够使用GetCallerIdentity()
来检索AssumedRoleId
向其颁发凭据的人。尤其role-session-name
是我们感兴趣的。
因此,为了实现这一点,我在另一个 API Gateway 方法后面创建了另一个 Lambda 函数。我将此 API Gateway 方法设置为在其方法请求配置中使用AWS_IAM
授权。在其集成请求中,我将其配置为. Lambda 函数只接受传入的请求并调用并返回结果。我在请求的授权标头中使用了上一次调用返回的凭据。Invoke with caller credentials
GetCallerIdentity()
AssumeRoleAsync()
根据在GetCallerIdentity文档和该页面所引用的Principal Table中找到的信息,我希望收到以下项目作为响应GetCallerIdentity()
:
Account
Arn
UserId
(这是本次讨论的重要部分)
UserId
应该是 的形式,与from 调用返回的形式role-id:caller-specified-role-name
完全相同。这将使我能够获得并做我们需要做的事情。AssumedRoleId
AssumeRoleAsync
caller-specified-role-name
但这不是UserId
来自 的响应的属性中返回的内容GetCallerIdentity()
。
相反,该UserId
属性包含的只是role-id
- 它完全省略了 essential caller-specified-role-name
。
有没有其他人看到过这种行为?我忽略了一些简单的事情吗?这可能是响应中的错误GetCallerIdentity
吗?
我正在使用以下 Amazon SDK 组件和版本进行这些不同的调用:
- 亚马逊.Lambda.Core/1.0.0
- Amazon.Lambda.Serialization.Json/1.1.0
- AWSSDK.Core/3.3.14
- AWSSDK.Lambda/3.3.6.2
- AWSSDK.SecurityToken/3.3.1.9
感谢您提供的任何帮助!
德里克