【问题标题】:How to protect static content in Web API如何保护 Web API 中的静态内容
【发布时间】:2025-12-15 12:00:02
【问题描述】:

考虑这种情况:我有一个使用 Web API 2.x 构建的 REST API,身份验证由 ASP.NET Identity 管理。用户可以上传附件作为记录的一部分,这些附件都存储在磁盘上的根文件夹中,位于名为Attachments 的目录下。

现在用户可以从他们的记录中生成 PDF。 PDF 包含指向附件文件的链接,当您单击它们时,会愉快地提供静态文件。例如:attachments/2018/01/somefile.jpeg

我需要做的是将这些媒体文件提供给授权用户。基本身份验证还不够,我不能只说为所有登录用户提供媒体文件。我需要查询数据库,检查用户分配和/或其他安全措施,并决定是否应该提供文件。

我一直在寻找可行的解决方案。如何通过 Web API 处理此类路由并仅向授权用户提供静态内容?值得一提的是,我的项目中没有使用 ASP.NET MVC。它只是带有用 TypeScript 编写的 Angular 1.6 应用程序的 Web API 2.x。

【问题讨论】:

  • 为了清楚起见:您使用的是 Authentication and Authorization 吗?使用来自AuthorizeAttribute Class 的属性?
  • 是的,我使用 Bearer 令牌进行身份验证,这是 Identity 中的默认实现。控制器和操作受到 Authorize 属性和角色的保护。
  • 这是一个类似问题的答案How do I protect static files... 这能解决您的问题吗?如果不是,您的问题和链接的问题有什么区别?
  • 感谢@JQuale。我会研究一下,我已经能够通过引入一个带有路由前缀(即“附件”)的新控制器来捕获请求。但似乎该请求与其他 OWIN 请求不同。没有当前用户或身份可供检查。它们只是空的。这是永远的..
  • 在这种没有当前用户的情况下,将附件文件夹上的安全设置设置为不允许匿名用户是否有意义?就像通过右键单击附件文件夹并在安全选项卡上设置权限一样。这样就需要经过身份验证的用户才能读取、写入等,或通过弹出用户名和密码强制用户身份验证

标签: asp.net security iis asp.net-web-api2 asp.net-web-api-routing


【解决方案1】:

以下方法应该适合您。

第 1 步- 拒绝所有用户对您的web.config 中的附件文件夹的直接访问权限,如下所示。

<location path="attachments"> 
<system.web>
<authorization> 
</authorization>
</system.web>
</location>

第 2 步:创建一个通用文件下载 API,这应该是您从服务器下载任何文件的单点。

您所有的安全链接应类似于/Download/somefilename

您通过针对登录用户检查请求文件,在您的下载 API 中实现数据级别的安全性。

【讨论】:

  • 是的,我知道 location 配置,但是如何通过 Web API 处理该端点?我的理解是 IIS 提供静态文件,因此路由请求甚至没有到达我的 Web API 管道。是否需要包含示例代码或其他内容?
  • 基本上在网站中存在像网站图片一样不受保护的静态内容,并且在您的情况下会有一些像“附件”这样的内容需要保护。对于不需要安全性的内容,让这些数据的 URL 保持不变,但是对于需要保护的内容,您不应该为您的文件夹提供直接的相对 URL,您需要更改 URL,例如 /Document/FileName在哪里使用它。这样,安全的内容加载责任将始终由控制器承担。
  • 我认为你是对的。这就是现在要走的路,指向磁盘上文件的相对 URL 将被删除,有利于动作控制器。这根本不可取,但我认为没有其他方法。无论您是通过 IIS 还是通过 Owin StaticFiles 提供静态内容,当请求磁盘上的文件时,您都不会有用户上下文。这只是一个不同的上下文,当前用户始终是 Windows 用户(例如您的应用程序池)。因此,也许应该从控制器请求所有媒体文件,以启用身份验证。我会试一试并更新这篇文章。