如何配置IAM策略限制Cognito用户访问指定S3文件夹(.NET SDK场景)
问题分析与解决方案
核心问题原因
你当前的ListObjectsV2请求没有指定Prefix参数,S3收到的请求中s3:prefix值为空字符串。而你的IAM策略仅允许s3:prefix为"111"或"111/*"的ListBucket操作,空字符串不满足条件,因此触发Access Denied。
方案一:修改代码指定Prefix(推荐,符合最小权限原则)
直接在请求中指定查询111/路径下的内容,这样请求的s3:prefix会匹配策略中的条件:
using (AmazonS3Client s3Client = new AmazonS3Client(cognitoAWSCredentials)) { ListObjectsV2Request listRequest = new() { BucketName = "MYBUCKET", Prefix = "111/" // 新增指定前缀 }; ListObjectsV2Response listResponse = await s3Client.ListObjectsV2Async(listRequest); }
对应的完整IAM策略(包含文件访问权限):
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowList111Folder", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::MYBUCKET", "Condition": { "StringLike": { "s3:prefix": [ "111", "111/*" ] } } }, { "Sid": "AllowGet111Objects", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::MYBUCKET/111/*" } ] }
方案二:允许根目录列表但仅显示111文件夹
如果需要用户调用根目录列表时只能看到111文件夹(隐藏222、333),需调整策略结合s3:delimiter和s3:prefix条件,并在代码中添加分隔符参数:
调整后的IAM策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListRootFor111Prefix", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::MYBUCKET", "Condition": { "StringLike": { "s3:prefix": [ "", "111/*" ] }, "StringEquals": { "s3:delimiter": "/" } } }, { "Sid": "AllowGet111Objects", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::MYBUCKET/111/*" } ] }
对应修改后的代码:
using (AmazonS3Client s3Client = new AmazonS3Client(cognitoAWSCredentials)) { ListObjectsV2Request listRequest = new() { BucketName = "MYBUCKET", Delimiter = "/" // 添加分隔符,让S3返回文件夹级别的前缀 }; ListObjectsV2Response listResponse = await s3Client.ListObjectsV2Async(listRequest); }
内容的提问来源于stack exchange,提问作者Andrej
相关产品推荐
相关产品推荐

