Igo*_*gor 15 asp.net asp.net-mvc asp.net-authorization asp.net-identity-2
我想保护我的应用程序中的特定文件夹和资源,这些文件夹和资源位于我的mvc应用程序的路由之外.我希望这些资源仅供经过身份验证的用户使用(只要经过身份验证,该角色就不具备这些角色).
最初似乎UrlAuthorizationModule就是答案.我按照本文,了解IIS 7.0 URL授权,我可以让模块工作,因为它响应了中的配置元素web.config.
我目前的问题是,我认为它是基于IIS中的匿名用户而不是asp.net身份中经过身份验证的用户制定的规则.
我使用标准html文件进行测试,而不是尝试加载脚本,因为这也会在MVC管道之外加载.
Visual Studio 2015.
.net 4.6.2Web项目Individual User Accounts添加 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>
Run Code Online (Sandbox Code Playgroud)
添加到文件夹结构
/Data/Protected.html // this file just has some basic Hello World content to display so you can see if it is loaded or not.
Run Code Online (Sandbox Code Playgroud)
Data路径中的所有内容始终被拒绝,无论用户是否经过身份验证都无关紧要.Deny和Allow中切换2行,情况也是如此web.config.Deny则即使用户未经过身份验证,也始终允许访问.roles角色名称而不是users属性,则角色也会被完全忽略.我错过了什么?如何让Url Authorization模块与MVC/WebAPI和ASP.NET Identity一起使用, Individual user accounts或者这根本不可行?
我也对其他想法持开放态度,也许答案是写一个习惯HttpModule或HttpHandler?
为什么和具体细节
这些资源是javascript文件,简而言之,只有部分脚本可供未经身份验证的用户使用.根目录中有2个目录,一个用于应用程序的经过身份验证的部分,另一个用于应用程序的未经身份验证的部分.其原因与应用程序中的用户授权或安全性无关,它是将应用程序的暴露表面区域限制为未经过身份验证的请求.
Leg*_*nds 13
[TL; DR;]
转到"完成root web.config"部分以查看所需的web.config设置.
以隐身模式进行测试以防止浏览器缓存问题!
并使用Ctrl+F5因为脚本和html文件被缓存.
首先拒绝访问root web.config中的所有匿名用户.
<authorization>
<deny users="?"/>
</authorization>
Run Code Online (Sandbox Code Playgroud)
这里的web.config允许一个文件夹可公开 访问.在我的示例中,此文件夹被调用css并位于MVC应用程序的根目录中.对于css文件夹,我将以下授权添加到根web.config:
<location path="css">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
Run Code Online (Sandbox Code Playgroud)
如果需要更多公用文件夹,可以添加更多这些位置路径.
虽然在用户登录之前无法访问所有其他文件,但始终可以访问css文件夹及其内容.
我还在root web.config中添加了一个静态文件处理程序,这很关键,因为您希望asp.net管道为特定文件类型管理请求:
<handlers>
<add name="HtmlScriptHandler" path="*.html" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />
</handlers>
Run Code Online (Sandbox Code Playgroud)
完成root web.config
<system.web>
<authentication mode="None" />
<authorization>
<deny users="?"/>
</authorization>
<compilation debug="true" targetFramework="4.6.2" />
<httpRuntime targetFramework="4.6.2" />
</system.web>
<location path="css">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
<system.webServer>
<modules>
<remove name="FormsAuthentication" />
<remove name="UrlAuthorization" />
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
</modules>
<handlers>
<add name="HtmlScriptHandler" path="*.html" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />
</handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
默认情况下,ASP.NET仅将允许和拒绝规则应用于托管处理程序处理的文件.静态文件不由托管处理程序管理.
您也可以设置:( 如果不是真的需要,请不要这样做!)
<modules runAllManagedModulesForAllRequests="true">
Run Code Online (Sandbox Code Playgroud)
随着runAllManagedModulesForAllRequests="true"所有的HTTP模块将在每次请求运行,而不仅仅是管理的要求(如的.aspx,ASHX).这意味着模块将在每个.jpg,.gif,.css,.html,.pdf,...请求上运行.
一件重要的事情
您不必将UrlAuthorizationModule添加到模块部分,因为它已经是ASP.NET管道的一部分.这意味着,它只会运行托管文件,而不是静态文件!
如果您现在删除然后将UrlAuthorizationModule重新添加到模块部分,它将在前提条件"integratedMode"下运行,而不再在"managedHandler"下运行!因此可以访问静态文件.
<remove name="UrlAuthorization" />
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
Run Code Online (Sandbox Code Playgroud)
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="managedHandler" />,那么UrlAuthorizationModule将不再限制对静态文件的访问.
您可以通过在注销时成功访问脚本文件夹中的脚本文件来测试它.按Ctrl + F5以确保获得脚本文件的全新副本.
ASP.NET UrlAuthorization < - > IIS URL授权之间的区别
请记住,managedHandler前置条件位于ASP.NET UrlAuthorization模块上,这一点很重要.前提条件告诉您仅当处理请求的代码映射到托管代码(通常是.aspx或.asmx页面)时才会调用URL授权模块.另一方面,IIS URL授权适用于所有内容.您可以从ASP.NET Url Authorization模块中删除managedHandler前提条件.这是为了防止在每个请求(例如对.html或.jpg页面的请求)必须通过托管代码时必须支付的性能压力.
PS:一些web.config属性区分大小写!
| 归档时间: |
|
| 查看次数: |
3682 次 |
| 最近记录: |