У меня есть сайт php, работающий под IIS 7.5. Сайт защищен аутентификацией Windows, и это прекрасно работает:
Когда пользователи заходят на сайт, их просят ввести имя пользователя и пароль, и они проходят через аутентификацию. Если пользователь нажимает кнопку «Отмена» или вводит неверный пароль 3 раза, они отображают страницу ошибки 401:
Теперь я хотел бы показать пользовательскую страницу, объясняющую, как войти в систему. Поэтому я перехожу на страницы ошибок, выбираю код состояния 401.2 и указываю на страницу, которую я хотел бы отобразить:
Затем убедитесь, что пользовательские ошибки включены для всех. И каа-бум! Аутентификация больше не работает, пользователи не представлены с запросом пароля. Как сказано в документации, проверка подлинности Windows работает, сначала отправляя ответ 401, затем браузер запрашивает у пользователя учетные данные поставщика, а затем они решают, что делать дальше.
Что здесь происходит: при первом запросе страницы IIS пытается отправить заголовок 401, но замечает, что web.config говорит: «перенаправить на 401 эту страницу». И вместо аутентификации он просто дает страницу перенаправления.
Я пытался заменить 401, 401.1, 401.2 - без разницы.
Что я делаю не так и как выдает пользовательскую страницу при ошибке аутентификации пользователя?
ps Вот файл web.config:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="500" subStatusCode="-1" />
<remove statusCode="404" subStatusCode="-1" />
<remove statusCode="401" subStatusCode="-1" />
<error statusCode="401" subStatusCode="2" prefixLanguageFilePath="" path="/not_restricted/401.htm" responseMode="ExecuteURL" />
<error statusCode="404" prefixLanguageFilePath="" path="/not_restricted/404.htm" responseMode="ExecuteURL" />
</httpErrors>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
</system.webServer>
<system.web>
<identity impersonate="false" />
<customErrors defaultRedirect="http://www.myserver.com/not_restricted/500.htm" mode="Off">
</customErrors>
</system.web>
</configuration>