Назад | Перейти на главную страницу

IIS7 не распространяет авторизацию на подкаталоги

В нашем приложении используется проверка подлинности с помощью форм, и решение работает хорошо.

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