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},确保不同用户的文件物理分离。 - 权限校验逻辑:
- 从当前登录用户的Claims中获取其UserGUID:
var currentUserGuid = User.FindFirstValue(ClaimTypes.NameIdentifier); if (string.IsNullOrEmpty(currentUserGuid)) { return Unauthorized(); } - 构造文件路径并校验归属:
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(); } - 验证文件存在后返回文件:
if (!System.IO.File.Exists(targetPath)) { return NotFound(); } return PhysicalFile(targetPath, MimeTypes.GetMimeType(targetPath));
- 从当前登录用户的Claims中获取其UserGUID:
- 避免暴露真实路径:前端使用逻辑ID或文件名发起请求,API内部通过数据库元数据(存储文件ID、用户GUID、真实文件名映射)获取真实路径,而非直接接收物理路径参数,进一步降低风险。
额外优化建议
- 禁止CDN直接访问原始存储目录,配置CDN从API拉取文件(或使用API生成的临时签名URL),确保所有请求都经过权限校验。
- 对上传的文件进行重命名(比如生成唯一ID作为文件名),避免文件名冲突和恶意文件名风险。
- 添加日志记录,追踪文件访问请求,便于排查异常访问。
内容的提问来源于stack exchange,提问作者Elchin Heydarov
相关产品推荐
相关产品推荐

