我正在开发一个AWS项目。我们希望能够发布具有有限权限的STS临时安全凭证,以便访问AWS服务。我们使用C#在.Net Core中工作。
我们正在使用STS AssumeRoleAsync()
,这是使用AWS AssumeRole操作的.Net SDK的方法来生成这些凭据。调用AssumeRoleAsync()
的响应是AssumeRoleResponse
对象,它包含在AssumeRoleUser
对象和Credentials
对象的一部分中。 AssumedRoleUser
的其中一个属性是AssumedRoleId
,其格式为role-id:role-session-name
。
我们有一个 Lambda函数,它处理调用AssumeRoleAsync
并以JSON对象的形式返回生成的凭据。 Lambda函数通过 API网关方法调用。
所有这一切都很好。以上只是为了设置场景。
我们希望能够做的下一件事是使用STS临时凭证对AWS服务进行其他调用。发生这种情况时,我们希望能够使用GetCallerIdentity()
为发出凭据的人检索AssumedRoleId
。特别是role-session-name
是我们感兴趣的。
因此,为了尝试实现这一点,我在另一个API网关方法后面创建了另一个Lambda函数。我将此API网关方法设置为在其方法请求配置中使用AWS_IAM
授权。在集成请求中,我将其配置为Invoke with caller credentials
。 Lambda函数只接受传入请求并调用GetCallerIdentity()
并返回结果。我在请求的授权标头中使用了之前AssumeRoleAsync()
调用返回的凭据。
根据GetCallerIdentity文档中以及该网页引用的Principal Table中的信息,我希望在GetCallerIdentity()
电话的响应中收到以下内容:< / p>
Account
Arn
UserId
(这是讨论的重点) UserId
应采用role-id:caller-specified-role-name
的形式,与调用AssumedRoleId
的{{1}}完全相同。这样我就可以获得AssumeRoleAsync
并做我们需要做的事情。
但这不是来自caller-specified-role-name
的回复的UserId
属性中返回的内容。
相反,GetCallerIdentity()
属性包含的所有内容都是UserId
- 它完全省略了基本role-id
。
还有其他人看过这种行为吗?我忽略了简单的事情吗?这可能是来自caller-specified-role-name
的回复中的错误吗?
我使用以下Amazon SDK组件和版本来进行这些不同的调用:
感谢您提出任何建议!
德里克