gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:45:05 24 4
gpt4 key购买 nike

我想保护我的应用程序中位于我的 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 中的所有内容路径总是被拒绝,用户是否通过身份验证都没有关系。
  • 如果我将 2 行切换为 Deny,情况也是如此和 Allowweb.config .
  • 如果我用 Deny 完全删除该行那么即使用户未通过身份验证,也始终允许访问。
  • 如果我添加一个角色并使用 roles使用角色名称而不是 users属性的作用也完全被忽略了。

  • 怎么办?

    我错过了什么?我怎样才能得到 Url Authorization使用 MVC/WebAPI 和 ASP.NET Identity 的模块 Individual user accounts或者这根本不可行?

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

    旁注

    为什么和细节

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

    最佳答案

    [TL;DR;]
    转至 “完成根 web.config”部分以查看所需的 web.config 设置。

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

    首先在根 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 文件夹及其内容将始终可以访问。

    我还在根 web.config 中添加了一个静态文件处理程序, 这很关键,因为您希望特定文件类型的请求由 asp.net 管道管理 :
    <handlers>
    <add name="HtmlScriptHandler" path="*.html" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />
    </handlers>

    完成根 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 、.h​​tml、.pdf ......请求上运行。

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

    如果您现在删除然后将 UrlAuthorizationModule 重新添加到模块部分,它将在前提条件“integratedMode”下运行,而不是在“managedHandler”下运行!因此可以访问静态文件。
    <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

    It is important to keep in mind that the managedHandler precondition is on the ASP.NET UrlAuthorization module. The precondition tells you that the URL authorization module is invoked only when the code that handles the request is mapped to managed code, typically an .aspx or .asmx page. IIS URL Authorization, on the other hand, applies to all content. You can remove the managedHandler precondition from the ASP.NET Url Authorization module. It is there to prevent a performance penality you have to pay when every request (such as a request to .html or .jpg pages) would have to go through managed code.



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

    关于asp.net - 使用 MVC 和 ASP.NET 身份进行 URL 授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42486638/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com