我想保护我的应用程序中特定文件夹和资源,这些资源不在mvc应用程序的路由之内。我希望这些资源只对已验证的用户(角色不重要,只要他们经过身份验证)可用。
最初似乎UrlAuthorizationModule是答案。我按照这篇文章Understanding IIS 7.0 URL Authorization操作,我可以使模块根据web.config
中的配置元素工作。
我的问题是我认为它基于IIS中的匿名用户而不是asp.net身份验证的验证用户实施规则。
测试环境
我使用标准的html
文件进行测试,而不是尝试加载脚本,因为这也将在MVC管道之外加载。
- 在
Visual Studio 2015
中。- 新建默认的
.net 4.6.2
web项目 - MVC 模板
- 身份验证=
单个用户帐户
- 新建默认的
- IIS 8(用于在Visual Studio之外测试)
- 认证->匿名身份验证(启用)
添加到 web.config
。
<configuration>
...
<location path="Data">
<system.webServer>
<security>
<authorization>
<clear/>
<add accessType="Deny" users="*"/>
<add accessType="Allow" users="?"/>
</authorization>
</security>
</system.webServer>
</location>
...
</configuration>
添加到文件夹结构
/Data/Protected.html // this file just has some basic Hello World content to display so you can see if it is loaded or not.
观察结果
- 使用此配置会始终拒绝
Data
路径中的所有内容,无论用户是否已通过身份验证。 - 如果我在
web.config
中切换Deny
和Allow
的2行,则情况也是如此。 - 如果我完全删除带有
Deny
的行,则即使用户未通过身份验证,也将始终允许访问。 - 如果我添加一个角色并使用角色名称的
roles
属性而不是users
属性,则该角色也将被完全忽略。
现在怎么办?
我错过了什么?我如何在MVC/WebAPI和ASP.NET Identity的Individual user accounts
上使用Url Authorization模块,或这根本做不到吗?
我也可以接受其他想法,也许答案是编写自定义HttpModule
或HttpHandler
?
附注
为什么和细节
这些资源是JavaScript文件,简而言之,只有未经身份验证的用户才能使用其中的一部分脚本。根目录中有两个目录,一个用于应用程序的已验证部分,另一个用于非验证部分。这样做的原因与用户授权或应用程序安全性无关,它旨在将应用程序的暴露表面限制为非身份验证请求。
HttpModule
,但在尝试与Asp.net Identity
集成时遇到了麻烦。而且我希望不必重新发明轮子。 - IgorHtmlScriptHandler
处理程序吗?:-) 因为 URL 授权在没有它的情况下也可以工作。我记得以前有问题,但现在我无法再现任何问题... 所以,在完整的 web.config 示例中注释掉此处理程序,在我的情况下可以正确处理 URL 授权。 - Legends