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

调用ListBucketsAsync报错:AWS AnonymousAWSCredentials不支持该操作

解决S3调用ListBucketsAsync时的匿名凭证错误

错误原因

你虽然通过Cognito用户池完成了用户认证,但两个关键问题触发了错误:

  1. 身份池关联的IAM认证角色没有授予s3:ListAllMyBuckets权限,请求因权限不足退化为匿名访问
  2. 初始化AmazonCognitoIdentityProviderClient时使用AnonymousAWSCredentials完全多余,用户池的认证接口不需要AWS凭证

解决步骤

1. 给IAM角色添加ListBuckets权限

登录AWS控制台操作:

  • 打开IAM控制台,找到你的Cognito身份池关联的已认证用户角色
  • 给该角色添加自定义策略,包含s3:ListAllMyBuckets权限:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        }
    ]
}

2. 修正Cognito客户端初始化代码

把创建AmazonCognitoIdentityProviderClient的代码改成不需要匿名凭证的形式:

// 替换原provider初始化代码
var provider = new AmazonCognitoIdentityProviderClient(RegionEndpoint.EUWest2);

3. 强制刷新Cognito凭证

在创建S3客户端前,先强制获取有效临时凭证,避免使用缓存的无效凭证:

CognitoAWSCredentials credentials = user.GetCognitoAWSCredentials(identityPoolID, RegionEndpoint.EUWest2);
// 强制刷新凭证
await credentials.GetCredentialsAsync().ConfigureAwait(false);

using (var client = new AmazonS3Client(credentials, RegionEndpoint.EUWest2))
{
    ListBucketsResponse response =
        await client.ListBucketsAsync(new ListBucketsRequest()).ConfigureAwait(false);

    foreach (S3Bucket bucket in response.Buckets)
    {
        Console.WriteLine(bucket.BucketName);
    }
}

额外提示

如果只是需要列出某个特定桶的内容,建议使用ListObjectsV2Async替代ListBucketsAsync,并给IAM角色配置针对该桶的s3:ListBucket权限,这样权限更安全、更精细。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:40:18