在不创建Web应用程序的情况下向子文件夹添加身份验证

时间:2009-02-03 21:21:17

标签: asp.net iis-6

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

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

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

有没有办法保护网站的新部分,同时利用现有的资源?

3 个答案:

答案 0 :(得分:5)

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

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

这对我使用FormsAuthentication有用,如果未经过身份验证,用户会被重定向到默认登录页面

答案 1 :(得分:3)

我输入了一个摘要,因为很多人都遇到了与子文件夹身份验证相同的情况。

子文件夹授权

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

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

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

    1在IIS中,按如下方式配置身份验证:

    • 启用匿名身份验证,
    • 启用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>
    

答案 2 :(得分:1)

删除该应用程序,然后将其添加到顶级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