【问题标题】:Add authentication to subfolders without creating a web application在不创建 Web 应用程序的情况下向子文件夹添加身份验证
【发布时间】:2009-02-03 21:21:16
【问题描述】:

我们有一个现有的可公开访问的 Web 应用程序,其中包含用户控件、数据访问库、图形等。我们希望在网站上创建一个新的安全部分,以访问一些现有资源。

最初,我们将站点的新部分创建为虚拟目录,(我们希望)允许我们访问父站点的资源。我们将适当的位置信息添加到基本 web.config(身份验证和授权),但我们继续看到以下错误“解析器错误消息:使用注册为 allowDefinition='MachineToApplication' 的部分超出应用程序级别是错误的。这个错误可能是由于虚拟目录未配置为 IIS 中的应用程序。"

为了响应该错误,我们将目录创建为新应用程序。这允许我们正确地进行身份验证,但缺点是无法访问父目录中的任何资源(因为它超出了应用程序范围)。

有什么方法可以保护网站的新部分,同时利用现有资源?

【问题讨论】:

  • 您使用什么身份验证?窗体,Windows?还是这只是来自 IIS 的基本或 Windows 集成身份验证?
  • 我们正在使用表单身份验证。

标签: asp.net iis-6


【解决方案1】:

在站点根目录的 web.config 文件中,如果添加:

<location path="relativePathToDir">
        <system.web>
            <authorization>
                <deny users="?"/>
            </authorization>
        </system.web>
    </location>

这适用于我使用 FormsAuthentication,如果未通过身份验证,用户将被重定向到默认登录页面

【讨论】:

  • 尽管这不是我们正在寻找的确切答案,但它为我们提供了一些非常有用的提示,即身份验证设置不应包含在位置部分中。感谢您的帮助。
  • 您的最终解决方案是什么?
  • 基本上我们所做的只是将安全目录的身份验证设置移到位置部分之外。我们假设授权和身份验证设置仅应用于安全目录。
  • 如果您有一个使用表单身份验证的站点,但您需要一个虚拟目录来仅启用匿名身份验证,您会怎么做?这可能吗?
  • @lhan16 没有调查,我认为这是可能的。如果它只是一个虚拟目录,我相信它应该和上面一样工作。如果它是一个应用程序,它可能会有所不同。但这又只是我的直觉
【解决方案2】:

我输入了一个摘要,因为许多人在子文件夹身份验证方面面临同样的情况。

子文件夹授权

  1. ASP.NET 只能有一个 身份验证模式为一个 应用。
  2. 不同的 应用程序不能共享资源 其中。

场景

假设主页不应该提示登录对话框。它应该让用户在没有任何登录的情况下通过。但是,在同一个应用程序中,可能在不同的文件夹中,另一个页面需要使用用户网络登录 ID 来检查用户对数据库表的权限。默认情况下,IE 将所有只有主机名的网站视为 Intranet。根据其默认的 Intranet 设置,如果使用 Windows 身份验证,它将不会提示登录对话框并将用户登录名和密码传递给应用程序。但是,棘手的是,如果应用程序有一个实际的域,IE 会认为它是一个 Internet 站点,如果使用 Windows 身份验证,它会提示登录名和密码。

不提示使用 Windows 身份验证的 Internet 站点的登录对话框的唯一方法是同时在 IIS 中打开匿名身份验证。但是,您将无法捕获登录信息,因为匿名优先于 Windows 身份验证。好消息是有办法解决这个问题。如果应用程序子文件夹需要捕获登录信息,则需要覆盖 web.config 中 Location 元素中的父授权。

1 在 IIS 中,配置 Authentication 如下:

  • 启用匿名身份验证,
  • 启用 Windows 身份验证

2 在 Web.Config 中添加以下内容。

<authentication mode="Windows" />
  <authorization>
   <allow users="*" />
</authorization>

<!-- secured is the relative subfolder name. deny anonymous user, so only the authenticated login will pass through -->
<location path="secured" allowOverride="true">
  <system.web>
    <authorization>        
        <deny users="?" />
    </authorization>
  </system.web>
</location>

【讨论】:

    【解决方案3】:

    删除应用程序,然后将其添加到顶级 web.config:

    <configuration>
        <system.web>
            <!-- applies application wide -->
        </system.web>
    
        <location path="securedirectory" allowOverride="false">
            <system.web>
                <!-- applies only to the path specified -->
            </system.web>
        </location>
    
    </configuration>
    

    MSDN Reference

    【讨论】:

      猜你喜欢
      • 2016-01-17
      • 1970-01-01
      • 2011-02-12
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      相关资源
      最近更新 更多