我该如何限制服务器上PDF文件的访问?

6
我正在使用ASP.Net MVC。 我已经使用ASP Forms身份验证限制了对网站的访问。 但是,网页包含指向服务器上PDF文件的链接,我也希望这些文件受到保护。
例如,用户可以浏览foo.com和foo.com/account/logon。 一旦他们登录,就可以访问foo.com/category/bar,该视图呈现bar.aspx中的视图。 在该视图中有一个链接到foo.com/files/theta.pdf,它可以在浏览器中正常加载。 但是,我不希望用户未经身份验证就能从浏览器访问foo.com/files/theta.pdf。
如何防止用户在未在foo.com/account/logon进行身份验证之前直接从其浏览器访问foo.com/files/theta.pdf?
4个回答

8

将请求通过控制器传递,并返回一个FileResult。您可以在控制器方法中应用任何所需的安全性,例如使用Authorize属性或在控制器方法内检查权限。

此问题中有一个示例代码,演示了如何返回图像文件。只需返回您的pdf而不是图像文件,并使用application/pdf作为MIME类型即可。


谢谢。我已将控制器更改为接受标识文件的参数,然后构建路径并返回FileResult。这样就能实现显示PDF的效果了。但是,用户仍然可以在浏览器中添加整个链接并打开它。我尝试按照Charles的建议将位置元素添加到web配置中,但没有实现效果(也许我做错了什么)。然而,通过使用IIS Manager在该文件夹上添加“拒绝”规则,我成功地实现了所需的效果。现在,用户无法直接显示PDF了。 - Jeff Rubingh
然而,用户仍然可以在浏览器中添加整个链接并将其带出。这就是为什么要将授权属性添加到控制器方法中,以限制访问只能给那些被分配到正确角色的用户。如果用户输入被拒绝访问的URL,他可以重定向到登录或未经授权的页面,而不是返回“FileResult”。这与您为允许或拒绝访问基于用户分配的角色而添加到任何控制器方法中的安全性相同。更多信息请参见:http://nerddinnerbook.s3.amazonaws.com/Part9.htm - Robert Harvey

4
如果您想限制对/files目录的所有访问,可以在web.config中使用location元素来限制访问。

例如:

<location path="~/files">
  <system.web>
    <authorization>
      <deny users="?" />
    </authorization>
  </system.web>
</location>

我应该补充一点,我同意Robert和Rob的高级安全性,但如果你只想要一个简单的解决方案,这个应该能解决问题。 :-)

希望对你有帮助,
Charles


不限制静态文件,它们由StaticFileModule处理程序模块处理,该模块不使用您的授权设置。 - Robert Benyi

1

如果用户知道媒体的URL,那么这如何限制对媒体的访问? - sparkyShorts

0
如果您使用了ASP.NET Core,您可以使用基于资源的授权
授权策略取决于所访问的资源。考虑一个具有作者属性的文档。只有作者才能更新该文档。因此,在授权评估之前,必须从数据存储中检索文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接