В нашем приложении используется проверка подлинности с помощью форм, и решение работает хорошо.
Недавно на одном из наших серверов 2008 года возникла проблема, при которой авторизация не распространяется на подкаталоги. То есть в главном web.config у нас есть следующие настройки авторизации.
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
Это вызывает перенаправление на страницу входа для неаутентифицированных пользователей (довольно стандартно).
Таблицы стилей находятся в подкаталоге / Content / Styles, а в каталоге Contents есть другой файл web.config, который переопределяет авторизацию следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<authorization>
<allow users="?" />
</authorization>
</system.web>
</configuration>
Это должно разрешить доступ к каталогу таблиц стилей для неаутентифицированных пользователей (также довольно стандартно).
Проблема в том, что серверные запросы таблиц стилей перенаправляются на страницу входа.
Я попытался удалить пулы сайтов и приложений и восстановить их, а также удалил роль IIS с сервера, включая WAS (службу активации процессов Windows), и переустановил. Ни один из них не решил проблему.
Я знаю, что конфигурация правильная, потому что я могу взять то же приложение и сбросить его при новой установке Server 2008, и оно работает.
Есть идеи, как исправить эту проблему, не перестраивая всю машину?
В конечном итоге эта проблема была вызвана тем, что каталог, в котором размещались файлы, был недоступен для учетной записи IUSR (это было несмотря на то, что он был доступен для «СЕТЕВОЙ СЛУЖБЫ» и удостоверения пула приложений). Когда я тестировал новую установку IIS7, я копировал дерево каталогов в \ inetpub \ wwwroot, к которому IUSR уже имел доступ.
До сих пор неясно, почему эта проблема проявляется как перенаправление на страницу входа (как если бы она не распространяла параметры авторизации должным образом), но я обнаружил некоторые проблемы с конфигурацией аутентификации форм.
Эта часть очень важна, потому что все, что я нашел, не объясняет это правильно (или адекватно).
Практически везде, где я искал, я нашел следующие настройки для web.config.
<configuration>
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/login.aspx" />
</authentication>
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
</system.web>
</configuration>
Обычно это объясняется тем, что неаутентифицированные пользователи перенаправляются на login.aspx, и аутентифицированным пользователям предоставляется доступ.
Фактически, этот раздел конфигурации применяется только к страницам ASP.NET (aspx). Любые другие типы содержимого (html, asp, jpg и т. Д.) Не регулируются этой конфигурацией.
Для защиты этих типов содержимого у вас должна быть установлена «Авторизация URL-адреса IIS 7», и для этого требуется раздел web.config, как показано ниже.
<system.webServer>
<security>
<authorization>
<clear />
<add accessType="Deny" users="?" />
<add accessType="Allow" users="*" />
</authorization>
</security>
</system.webServer>
Я видел одно место, в котором объяснялась разница между IIS6 и IIS7, но это не совсем точно. Существуют разные механизмы авторизации для разных типов контента и Вам нужны оба, если вы хотите ограничить доступ к страницам без aspx.
Мне пришла в голову идея, что в вашей подпапке "styles" есть еще один файл web.config, который содержит еще один <deny users="?">
правило.
В следующей ветке форума есть обсуждение, которое может вас заинтересовать: Проблема с наследованием web.config и разделом <authorization>.
Эта статья MSDN содержит интересное предложение. Я не знаю, как это интерпретировать:
Правила, содержащиеся в файлах конфигурации уровня приложения, имеют приоритет над унаследованными правилами. Система определяет, какое правило имеет приоритет, создавая объединенный список всех правил для URL-адреса, причем самые последние правила (ближайшие в иерархии) находятся во главе списка.