【发布时间】:2017-07-18 02:51:02
【问题描述】:
我想保护我的应用程序中位于我的 mvc 应用程序路由之外的特定文件夹和资源。我希望这些资源只对经过身份验证的用户可用(只要他们经过身份验证,哪个角色就无关紧要)。
最初,UrlAuthorizationModule 似乎是答案。我关注了这篇文章Understanding IIS 7.0 URL Authorization,我可以让模块在它响应web.config 中的配置元素的意义上工作。
我目前的问题是我认为它是基于 IIS 中的匿名用户而不是 asp.net identity 中的经过身份验证的用户来制定规则。
测试环境
我使用标准的html 文件进行测试,而不是尝试加载脚本,因为这也将在 MVC 管道之外加载。
- 在
Visual Studio 2015。- 新的默认
.net 4.6.2网络项目 - MVC 模板
- 身份验证 =
Individual User Accounts
- 新的默认
- 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的两行,情况也是如此。 - 如果我完全删除带有
Deny的行,那么即使用户未通过身份验证,也始终允许访问。 - 如果我添加一个角色并将
roles与角色名称一起使用而不是users属性,则该角色也会被完全忽略。
现在呢?
我错过了什么?如何让 Url Authorization 模块与 MVC/WebAPI 和 ASP.NET Identity Individual user accounts 一起使用,或者这根本不可行?
我也对其他想法持开放态度,也许答案是编写自定义HttpModule 或HttpHandler?
旁注
原因和细节
这些资源是 javascript 文件,简而言之,未经身份验证的用户应该可以使用其中的一部分脚本。根目录中有 2 个目录,一个用于应用程序的已验证部分,一个用于应用程序的未验证部分。这样做的原因与应用程序中的用户授权或安全性无关,它是将应用程序的暴露表面区域限制为未经身份验证的请求。
【问题讨论】:
-
我没有使用 url 授权模块的经验,但是如果您使用 HttpModule,您可以在
AuthorizeRequest事件阶段检查用户是否已通过身份验证以及他想要访问哪个路径... -
@Legends - 我最初尝试了
HttpModule,但在尝试与Asp.net Identity集成时遇到了麻烦。我也希望我不必重新发明轮子。 -
你试过了吗:
<add accessType="Deny" users="?"/> <add accessType="Allow" users="*"/>?如果这不起作用,则换行,不知道正确的顺序是什么。 -
@Legends - 我做到了,该设置在经过身份验证和未经过身份验证时都限制了对请求的访问。切换顺序没关系。
-
?用于匿名用户,*用于经过身份验证的用户,添加语句的顺序也很重要,只是要清楚;-) 250 赏金,我相信有人会回答它。 ...
标签: asp.net asp.net-mvc asp.net-identity-2 asp.net-authorization