Настройка режима проверки поддиректории в приложениях, размещенных под корневым сайтом
На моей локальной машине я работаю на нескольких веб-сайтах и запускаю их в 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.