调用ListBucketsAsync报错:AWS AnonymousAWSCredentials不支持该操作
解决S3调用ListBucketsAsync时的匿名凭证错误
错误原因
你虽然通过Cognito用户池完成了用户认证,但两个关键问题触发了错误:
- 身份池关联的IAM认证角色没有授予
s3:ListAllMyBuckets权限,请求因权限不足退化为匿名访问 - 初始化
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
相关产品推荐
相关产品推荐

