具有代入角色凭证的 AWS 开发工具包 .NET 依赖注入

Gre*_*uff 6 c# amazon-web-services aws-sdk-net

版本

  • .net核心sdk v3.1.301
  • AWSSDK.Extensions.NETCore.Setup v3.3.101
  • AWSSDK.IdentityManagement v3.3.106.19
  • AWSSDK.SecurityToken v3.3.105.30

定义

由于这个问题讨论了不同类型的AWS凭证,我认为定义我正在使用的术语会很有帮助

应用程序凭证- 启动时由 .NET Core AWS SDK 加载的 AWS 凭证
承担角色凭证- 在运行时从 STS 获取的临时 AWS 凭证

问题

我正在编写一些使用 AWS 开发工具包与 AWS 交互的代码。使用 AWS SDK 时,我倾向于使用依赖注入容器中内置的 ASP.NET Core 来注入服务客户端:

services.AddAWSService<IAmazonIdentityManagementService>();
services.AddAWSService<IAmazonSecurityTokenService>();
Run Code Online (Sandbox Code Playgroud)

当您想要使用应用程序凭据时,这很有效。AWS 客户端的注入和实例按预期工作

public class IamService : IIamService
{
    private readonly IAmazonIdentityManagementService _iamClient;

    public IamService(IAmazonIdentityManagementService iamClient)
    {
        _iamClient = iamClient;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我的应用程序需要在多个帐户中承担多个角色

我能想到的唯一方法是调用 STS 来获取假设角色凭据

AssumeRoleRequest request = new AssumeRoleRequest()
{
    RoleSessionName = "MySession",
    RoleArn = "arn:aws:iam::123456789012:role/MyRole"
};

AssumeRoleResponse response = await _service.AssumeRoleAsync(request);
Run Code Online (Sandbox Code Playgroud)

_service类型在哪里IAmazonSecurityTokenService

然后new增加对 AWS SDK 的所有调用

AmazonIdentityManagementServiceClient service = 
    new AmazonIdentityManagementServiceClient(response.Credentials);
Run Code Online (Sandbox Code Playgroud)

问题

有没有一种更干净的方法可以处理这个问题,这意味着我不必到处实例化新的 SDK 客户端?

我希望有一些神奇的方法可以配置 DI 容器,如果提供了假设角色凭证,则使用这些凭证注入 AWS SDK 的实例,否则使用应用程序凭证 - 经过大量谷歌搜索后我无法做到这一点没有找到任何表明这是可能的......