使用MVC和ASP.NET身份进行URL授权

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项目
    • 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>
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路径中的所有内容始终被拒绝,无论用户是否经过身份验证都无关紧要.
  • 如果我在中DenyAllow中切换2行,情况也是如此web.config.
  • 如果我完全删除该行,Deny则即使用户未经过身份验证,也始终允许访问.
  • 如果我添加角色并使用roles角色名称而不是users属性,则角色也会被完全忽略.

怎么办?

我错过了什么?如何让Url Authorization模块与MVC/WebAPI和ASP.NET Identity一起使用, Individual user accounts或者这根本不可行?

我也对其他想法持开放态度,也许答案是写一个习惯HttpModuleHttpHandler


旁注

为什么和具体细节

这些资源是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)


如果将前置条件设置为managed : <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属性区分大小写!