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

ASP.NET Core 6 Web API用户文件权限控制问题咨询

ASP.NET Core 6 Web API 文件访问权限控制方案

核心思路

放弃直接通过CDN暴露物理文件路径的方式,改为通过API中转所有文件访问请求,在API层完成身份验证和权限校验,确保只有合法用户能访问自己的文件。

1. 实现仅登录用户可访问

  • 在Program.cs中配置身份验证中间件(以JWT为例):
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            ValidAudience = builder.Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
        };
    });

builder.Services.AddAuthorization();

// 在中间件管道中启用认证和授权
app.UseAuthentication();
app.UseAuthorization();
  • 创建文件访问接口,并添加[Authorize]特性,确保只有已登录用户能访问:
[ApiController]
[Route("api/files")]
[Authorize]
public class FilesController : ControllerBase
{
    // 接口实现
}

2. 实现用户文件隔离

  • 物理存储隔离:严格按照用户GUID命名文件夹,比如存储路径为/var/uploads/{UserGUID}/{FileName},确保不同用户的文件物理分离。
  • 权限校验逻辑:
    1. 从当前登录用户的Claims中获取其UserGUID:
      var currentUserGuid = User.FindFirstValue(ClaimTypes.NameIdentifier);
      if (string.IsNullOrEmpty(currentUserGuid))
      {
          return Unauthorized();
      }
      
    2. 构造文件路径并校验归属:
      var baseStoragePath = "/var/uploads";
      var requestedFileName = Request.Query["fileName"]; // 或从路由参数获取
      var targetPath = Path.GetFullPath(Path.Combine(baseStoragePath, currentUserGuid, requestedFileName));
      
      // 防止路径遍历攻击,确保目标路径在当前用户的文件夹范围内
      var userFolderPath = Path.GetFullPath(Path.Combine(baseStoragePath, currentUserGuid));
      if (!targetPath.StartsWith(userFolderPath, StringComparison.Ordinal))
      {
          return Forbid();
      }
      
    3. 验证文件存在后返回文件:
      if (!System.IO.File.Exists(targetPath))
      {
          return NotFound();
      }
      return PhysicalFile(targetPath, MimeTypes.GetMimeType(targetPath));
      
  • 避免暴露真实路径:前端使用逻辑ID或文件名发起请求,API内部通过数据库元数据(存储文件ID、用户GUID、真实文件名映射)获取真实路径,而非直接接收物理路径参数,进一步降低风险。

额外优化建议

  • 禁止CDN直接访问原始存储目录,配置CDN从API拉取文件(或使用API生成的临时签名URL),确保所有请求都经过权限校验。
  • 对上传的文件进行重命名(比如生成唯一ID作为文件名),避免文件名冲突和恶意文件名风险。
  • 添加日志记录,追踪文件访问请求,便于排查异常访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:39:57