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

时间:2017-02-27 13:09:56

标签: asp.net asp.net-mvc asp.net-identity-2 asp.net-authorization

我希望保护我的应用程序中的特定文件夹和资源,这些文件夹和资源位于我的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路径中的所有内容始终被拒绝,无论用户是否经过身份验证都无关紧要。
  • 如果我在Deny中切换Allowweb.config的2行,情况也是如此。
  • 如果我使用Deny完全删除该行,则即使未对用户进行身份验证,也始终允许访问。
  • 如果我添加角色并使用roles代替users属性,则角色也会被完全忽略。

现在怎么办?

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

我也对其他想法持开放态度,也许答案是撰写自定义HttpModuleHttpHandler

旁注

为什么&amp;具体

这些资源是javascript文件,简而言之,只有部分脚本可供未经身份验证的用户使用。根目录中有2个目录,一个用于应用程序的经过身份验证的部分,另一个用于应用程序的未经身份验证的部分。其原因与应用程序中的用户授权或安全性无关,它是将应用程序的暴露表面区域限制为未经过身份验证的请求。

1 个答案:

答案 0 :(得分:12)

<强> [TL; DR;]
转到&#34;完成root web.config&#34; 部分,查看所需的web.config设置。

以隐身模式进行测试,以防止出现浏览器缓存问题! 并使用Ctrl+F5因为脚本和html文件被缓存。

首先拒绝访问root web.config中的所有匿名用户。

<authorization>
    <deny users="?"/>        
</authorization>

此处的web.config允许一个文件夹公开 可访问。在我的示例中,此文件夹名为css,位于MVC应用程序的根目录中。对于css文件夹,我将以下授权添加到根web.config:

<location path="css">
    <system.web>
        <authorization>          
            <allow users="*"/>
        </authorization>
    </system.web>
</location>

如果您需要更多公用文件夹,可以添加更多这些位置路径。

虽然在用户登录之前无法访问所有其他文件,但始终可以访问css文件夹及其内容。

我还在root web.config中添加了一个静态文件处理程序,这很关键,因为您希望asp.net管道为特定文件类型管理请求

<handlers>
    <add name="HtmlScriptHandler" path="*.html" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />
</handlers> 

完成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>

默认情况下,ASP.NET仅将允许和拒绝规则应用于托管处理程序处理的文件。静态文件不受托管处理程序管理。

你也可以设置:(不要这样做,如果不是真的需要!

 <modules runAllManagedModulesForAllRequests="true">

使用runAllManagedModulesForAllRequests="true"所有HTTP模块都将在每个请求上运行,而不仅仅是托管请求(例如.aspx,ashx)。这意味着模块将在每个.jpg,.gif,.css,.html,.pdf,...请求上运行。

重要的一件事
您不必将UrlAuthorizationModule添加到模块部分,因为它已经是ASP.NET管道的一部分。这意味着,它只能运行托管文件,而不是静态文件!

如果您现在删除然后将UrlAuthorizationModule重新添加到模块部分,它将在前提条件下运行&#34; integratedMode&#34;而不是&#34; managedHandler&#34;了!因此可以访问静态文件。

<remove  name="UrlAuthorization" />
<add  name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />

<小时/> 如果将前置条件设置为托管: <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="managedHandler" />,然后UrlAuthorizationModule将不再限制对静态文件的访问。

您可以通过在注销时成功访问脚本文件夹中的脚本文件来对此进行测试。按Ctrl + F5以确保获得脚本文件的新副本。

<强> Difference between ASP.NET UrlAuthorization <--> IIS URL Authorization

  

重要的是要记住managedHandler前提条件   在ASP.NET UrlAuthorization模块上。前提条件告诉你   只有在代码那个时才调用URL授权模块   处理请求被映射到托管代码,通常是.aspx或   .asmx页面。另一方面,IIS URL授权适用于所有人   内容。您可以从中删除managedHandler前置条件   ASP.NET Url授权模块。它是为了防止性能   每次请求时你必须支付的笔记(例如请求   .html或.jpg页面)必须通过托管代码。

P.S。:某些web.config属性区分大小写!