在根站点下托管的应用程序中配置子目录身份验证模式

时间:2011-09-09 02:48:49

标签: asp.net iis web-config

在我的本地计算机上,我在多个网站上工作,并在“默认”网站下的IIS下运行它们。这样我就可以通过这种类型的网址访问网站:http://localhost/App1/。这是结构:

LocalDev (site)
    App1 (application)
    App2 (application)
    App3 (application)

我遇到的问题是在App1中,我正在尝试在App1的子目录上启用Windows身份验证,如下所示:

<configuration>
  <location path="internal">
    <system.web>
      <authentication mode="Windows"/>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>
</configuration>

不幸的是,当我尝试访问http://localhost/App1/internal/url.aspx时,我收到此错误:

  

在应用程序级别之外使用注册为allowDefinition ='MachineToApplication'的部分是错误的。此错误可能是由于虚拟目录未在IIS中配置为应用程序。

App1设置为应用程序,而不是虚拟目录。我已经尝试更改我的machine.config以允许在任何地方更改身份验证部分:

<configuration>
  <configSections>
    <sectionGroup name="system.web" type="System.Web.Configuration.SystemWebSectionGroup, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
      <section name="authentication" type="System.Web.Configuration.AuthenticationSection, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" allowDefinition="Everywhere"/>
    </sectionGroup>
  </configSections>
</configuration>

如何允许我的网站设置自己的身份验证模式?

5 个答案:

答案 0 :(得分:19)

您需要在Web.config中的应用程序级别启用Windows身份验证,然后在文件夹级别进一步定义授权,允许root用户的所有用户拒绝internal文件夹的所有未经身份验证。

在IIS中,确保为应用程序启用匿名身份验证 Windows身份验证。然后,按如下所示修改Web.config:

<configuration>
  <system.web>
      <authentication mode="Windows"/>
      <authorization>
        <allow users="*"/>
      </authorization>
  </system.web>
  <location path="internal" allowOverride="true">
    <system.web>
      <authorization>
        <deny users="?"/>
      </authorization>
    </system.web>
  </location>
</configuration>

答案 1 :(得分:2)

您无法在子目录中更改身份验证模式。只有WebApplications可以定义适用于整个应用程序的此设置。 location元素仅在子目录中用于更改授权,而不是身份验证设置。

您需要在IIS中将子目录创建为Web应用程序。

如果您说子子目录实际上已经是IIS中的Web应用程序(错误表明情况并非如此),那么您需要禁用继承。这与您是否在根目录中有web.config无关。如果不是它只是意味着它使用默认的机器配置设置。

您可以通过在根目录中添加web.config来禁用继承,并使用以下元素包装system.web。

<location path="." inheritInChildApplications="false">
   <system.Web>
       ...
   </system.Web>
</location>

答案 2 :(得分:0)

我在两种情况中的一种情况下遇到了这个错误,这两种情况都是由于应用程序是整个“默认”应用程序的子目录所致:

子目录也需要是一个有效的应用程序

您已经注意到该目录被标记为应用程序,但是为了完整性,您可以仔细检查应用程序是否也在工作,能够执行脚本并拥有其目录中文件的权限。

嵌套的web.config文件

这是我认为您实际遇到的问题:

确保web.config文件的层次结构(包括开发应用程序上方的“默认”应用程序中的任何文件)不会相互干扰。请记住,作为“默认”的子目录,您的应用程序可能仍会受到其上方“默认”应用程序中的设置的影响。

答案 3 :(得分:0)

我偶尔会看到这个问题,而且一直是服务器没有将其识别为已配置的网络。如果可能,您可以尝试删除应用程序,然后将每个子目录转换回它自己的应用程序。

这总是为我修好。双击和三重检查子目录是否设置为应用程序。

另外,为了避免其他问题,因为您正在设置Windows身份验证,请检查NTLM vs Kerberos设置。通常这是一个不同的错误消息或只是不会正确验证,但如果这是一个互联网环境而不是内部网环境,你很可能需要禁用Kerberos。

还要确保已检查是否已启用Windows身份验证。 http://technet.microsoft.com/en-us/library/cc754628(WS.10).aspx

您可以在Windows身份验证的高级设置下启用和禁用Kerberos。

答案 4 :(得分:0)

您可以通过将应用程序作为虚拟目录运行来解决此问题,然后它们将在应用程序池中获得单独的进程,或者您可以为每个应用程序创建一个,仍然可以以相同的方式访问目录等。

在此处阅读更多内容:http://learn.iis.net/page.aspx/150/understanding-sites-applications-and-virtual-directories-on-iis-7/

我认为你需要在根目录中有一个web.config文件,即使它或多或少为空,并将 allowSubDirConfig 设置为true。