У меня есть сервер W2K8 с IIS 7.5, на котором размещены два сайта, которые указывают на одно веб-приложение asp.net.
Веб-приложение настроено для проверки подлинности с помощью форм и встроенной (Windows) проверки подлинности. Для loginUrl устанавливается страница входа в систему, настроенная для встроенной аутентификации; если пользователя невозможно идентифицировать с помощью Request.ServerVariables ["LOGON_USER"], приложение перенаправляет пользователя на страницу входа, настроенную для проверки подлинности с помощью форм.
Проблема в том, что когда я захожу на сайт как анонимный пользователь, IIS выдает запрос 401, поэтому логика перенаправления пользователя на страницу входа в формы никогда не выполняется. Мне посоветовали настроить два сайта и указать, чтобы они оба указывали на одно и то же веб-приложение; Проблема здесь в том, что свойство loginUrl в web.config перезаписывается изменениями на любом сайте. Как настроить оба сайта для использования разных режимов аутентификации?
ASP.NET не поддерживает одновременное использование нескольких встроенных модулей аутентификации. Это заметно в документация, <authentication mode="[Windows|Forms|Passport|None]" ...>
Решения:
Пример:
<location path="My Awesome Site - Forms">
<system.web>
<authentication mode="Forms" />
</system.web>
</location>
<location path="My Awesome Site - Windows">
<system.web>
<authentication mode="Windows" />
<identity impersonate="true"/>
</system.web>
</location>
Я понимаю, что это старый вопрос, но я пытался сделать именно это и не смог; ответ, предложенный Саймоном, меня не устроил. Я заставил это работать с помощью кода. В моем случае я хотел, чтобы на одном сайте была разрешена анонимная проверка подлинности, а на другом - проверка подлинности NTLM (Windows). Оба этих сайта размещались на CMS, поэтому это не так просто, как установка правил авторизации для путей.
В итоге я проверил Request.ServerVariables["LOGON_USER"]
ценность, а также Request.Url.Host
а затем принудительно ввести код ответа 401
для представления запроса аутентификации браузеру посетителя. У меня есть режимы анонимной проверки подлинности и проверки подлинности Windows, включенные в файле Web.config, который является общим для сайтов.
Пример WebForms:
// we only care about authorization for one of the sites
if (Request.Url.Host == "use-ntlm.example.com"
&& string.IsNullOrEmpty(Request.ServerVariables["LOGON_USER"]))
{
Response.StatusCode = 401;
Response.End();
return;
}