Настройка режима проверки поддиректории в приложениях, размещенных под корневым сайтом

На моей локальной машине я работаю на нескольких веб-сайтах и ​​запускаю их в IIS на веб-сайте "По умолчанию". Таким образом, я могу получить доступ к сайтам с помощью этого типа URL: http://localhost/App1/. Здесь структура:

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

Проблема, с которой я сталкиваюсь, заключается в том, что в App1 я пытаюсь включить проверку подлинности Windows в подкаталоге App1, например:

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

Что мне нужно сделать, чтобы мои сайты могли устанавливать свои собственные режимы аутентификации?

Ответы

Ответ 1

Вам нужно включить проверку подлинности Windows на уровне приложения в Web.config, затем дополнительно определить авторизацию на уровне папки, разрешив всем пользователям 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>

Ответ 2

Вы не можете изменить режим аутентификации в подкаталоге. Только WebApplications может определить этот параметр, который применяется ко всему приложению. Элемент местоположения используется только в подкаталогах для изменения авторизации, а не настроек проверки подлинности.

Вам нужно создать подкаталоги в виде веб-приложений в IIS.

Если вы говорите, что дочерний подкаталог на самом деле уже является веб-приложением в IIS (ошибка говорит о том, что это не так), тогда вам нужно отключить наследование. Это не имеет никакого отношения к тому, есть ли у вас файл web.config в корне. Если это не так, это означает, что он использует настройки конфигурации машины по умолчанию.

Вы можете отключить наследование, добавив в корневой файл web.config со следующим элементом, который обертывает ваш system.web.

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

Ответ 3

Я столкнулся с этой ошибкой в ​​одном из двух сценариев, оба из которых были связаны с тем, что приложения являются подкаталогами общего приложения "По умолчанию":

Подкаталоги также должны быть рабочим приложением

Вы уже отметили, что каталог помечен как приложение, однако для полноты вы можете дважды проверить, что приложение также работает, умеет выполнять сценарии и имеет разрешение на файлы в его каталогах.

Вложенные файлы web.config

Это проблема, о которой я думаю, что вы действительно переживаете:

Убедитесь, что ваша иерархия файлов web.config, включая любые в приложении "По умолчанию" над вашими приложениями разработки, не мешает друг другу. Помните, что в качестве подкаталога "По умолчанию" ваше приложение по-прежнему может быть затронуто настройками в приложении "По умолчанию" над ним.

Ответ 4

Я вижу эту проблему время от времени, и всегда было, что сервер не распознает ее как настроенную сеть. То, что вы могли бы попробовать, если это возможно, - удалить приложение и затем преобразовать каждый подкаталог обратно в его собственное приложение.

Это всегда исправляло это для меня. Двойная и тройная проверка, что подкаталоги установлены как приложения.

Также, чтобы избежать других проблем, поскольку вы устанавливаете проверку подлинности Windows, проверьте настройки NTLM и Kerberos. Обычно это другое сообщение об ошибке или просто не аутентифицируется должным образом, но если это интернет-среда, а не среда интрасети, скорее всего, вам нужно отключить Kerberos.

Также убедитесь, что вы проверили, что Windows Authentication включена. http://technet.microsoft.com/en-us/library/cc754628(WS.10).aspx

Вы можете включить и отключить Kerberos в разделе "Дополнительные параметры" в Windows Authentication.

Ответ 5

Вы можете решить эту проблему, запустив приложения в качестве виртуальных каталогов, затем они будут получать отдельные процессы в пуле приложений, или вы можете иметь их для каждого приложения, и все же ваши каталоги и т.д. будут по-прежнему доступны одинаково.

Подробнее здесь: http://learn.iis.net/page.aspx/150/understanding-sites-applications-and-virtual-directories-on-iis-7/

Я думаю, вам понадобится файл web.config в корневом каталоге, даже если он более или менее пуст, и установите для параметра allowSubDirConfig значение true.