Я набрал резюме, так как многие сталкивались с одинаковой ситуацией в отношении аутентификации подпапок.
Авторизация подпапки
- ASP.NET может иметь только один
режим аутентификации для одного
приложение.
- разные
приложения не могут делиться ресурсом
среди них.
Сценарий
Допустим, домашняя страница не должна вызывать диалог входа в систему. Это должно позволить пользователям проходить без входа в систему. Однако в том же приложении, предположительно, в другой папке, другой странице необходимо проверить разрешение пользователя по таблице базы данных, используя идентификатор входа в сеть пользователя. По умолчанию IE обрабатывает весь веб-сайт только с именем хоста в интрасети. По умолчанию в интрасети он не выводит диалоговое окно входа в систему и не передает имя пользователя и пароль в приложение, если используется проверка подлинности Windows. Однако сложная сторона заключается в том, что если приложение имеет фактический домен, IE будет считать, что это Интернет-сайт, и запрашивает логин и пароль, если используется аутентификация Windows.
Единственный способ не открывать диалоговое окно входа для интернет-сайта, использующего проверку подлинности Windows, - это также включить анонимную проверку подлинности в IIS. Однако вы потеряете возможность сбора информации для входа, поскольку Аноним имеет приоритет над проверкой подлинности Windows. Хорошей новостью является то, что есть способ решить эту проблему. Если в подпапку приложения требуется записать информацию для входа, вам нужно перезаписать родительскую авторизацию в элементе Location в web.config.
1 В IIS настройте Аутентификацию следующим образом:
- Включить анонимную аутентификацию,
- Включить проверку подлинности Windows
2 Добавьте следующее в Web.Config.
<authentication mode="Windows" />
<authorization>
<allow users="*" />
</authorization>
<!-- secured is the relative subfolder name. deny anonymous user, so only the authenticated login will pass through -->
<location path="secured" allowOverride="true">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>