You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在.NET应用中使用AWS服务账户替代AWS凭证?

.NET应用替换AWS凭证为服务账户令牌的实现方案

要将.NET应用中的AWS凭证替换为服务账户令牌(以K8s ServiceAccountToken为例),核心是通过IAM Roles for Service Accounts (IRSA) 关联服务账户与AWS IAM角色,再用服务账户令牌获取AWS临时凭证,最终注入AWS SDK使用。以下是具体实现步骤和代码:

实现步骤

  1. 前提配置:已完成IRSA关联(创建IAM角色并绑定K8s服务账户,确保服务账户有访问该角色的权限)。
  2. 读取服务账户令牌:从容器默认路径读取令牌文件。
  3. 调用STS API获取临时凭证:使用令牌调用AssumeRoleWithWebIdentity接口获取AWS临时访问凭证。
  4. 注入AWS SDK:将临时凭证(或自动刷新的凭证提供者)传入AWS服务客户端。

代码示例

1. 读取服务账户令牌

// 读取K8s默认路径下的ServiceAccountToken
var serviceAccountToken = File.ReadAllText("/var/run/secrets/kubernetes.io/serviceaccount/token");

2. 获取AWS临时凭证

using Amazon.SecurityToken;
using Amazon.SecurityToken.Model;

var stsClient = new AmazonSecurityTokenServiceClient();
var assumeRoleRequest = new AssumeRoleWithWebIdentityRequest
{
    RoleArn = "arn:aws:iam::你的AWS账号ID:role/你的IRSA角色名称",
    RoleSessionName = "dotnet-app-session", // 自定义会话名称
    WebIdentityToken = serviceAccountToken
};

var assumeRoleResponse = await stsClient.AssumeRoleWithWebIdentityAsync(assumeRoleRequest);
var tempCredentials = assumeRoleResponse.Credentials;

3. 使用临时凭证初始化AWS服务客户端

using Amazon.S3;
using Amazon.Runtime;

// 基于临时凭证创建会话凭证
var sessionCredentials = new SessionAWSCredentials(
    tempCredentials.AccessKeyId,
    tempCredentials.SecretAccessKey,
    tempCredentials.SessionToken);

// 初始化S3客户端(可替换为其他AWS服务客户端)
var s3Client = new AmazonS3Client(sessionCredentials);
// 后续调用AWS服务示例
var buckets = await s3Client.ListBucketsAsync();

4. 自动刷新临时凭证(可选)

临时凭证存在过期时间,可通过RefreshingAWSCredentials实现自动刷新:

var refreshingCredentials = new RefreshingAWSCredentials(
    async () =>
    {
        var token = File.ReadAllText("/var/run/secrets/kubernetes.io/serviceaccount/token");
        var stsResponse = await stsClient.AssumeRoleWithWebIdentityAsync(new AssumeRoleWithWebIdentityRequest
        {
            RoleArn = "arn:aws:iam::你的AWS账号ID:role/你的IRSA角色名称",
            RoleSessionName = "dotnet-app-session",
            WebIdentityToken = token
        });
        
        return new CredentialsRefreshResult
        {
            Credentials = new SessionAWSCredentials(
                stsResponse.Credentials.AccessKeyId,
                stsResponse.Credentials.SecretAccessKey,
                stsResponse.Credentials.SessionToken),
            Expiration = stsResponse.Credentials.Expiration
        };
    },
    tempCredentials.Expiration);

// 使用自动刷新的凭证创建客户端
var autoRefreshS3Client = new AmazonS3Client(refreshingCredentials);

注意事项

  • 确保应用所在环境(如K8s Pod)能访问AWS STS服务,且IRSA角色已配置对应AWS服务的权限。
  • 若服务账户令牌路径非默认值,需调整读取路径。
  • 使用AWS SDK for .NET版本需≥3.5.0,以支持RefreshingAWSCredentials和相关STS API。

内容的提问来源于stack exchange,提问作者Psdet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:10:19