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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:06:51