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

Как настроить два сайта на одном сервере IIS 7.5 для одного веб-приложения ASP.NET с разными режимами проверки подлинности

У меня есть сервер 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]" ...>

Решения:

  • Создайте собственный модуль IHttpModule, который обрабатывает аутентификацию.
  • Разделите свое приложение на два веб-приложения в IIS, которые указывают на два разных каталога с разными файлами конфигурации. Это самое простое решение.
  • Разделите ваше приложение на два веб-приложения в вашем IIS, но направьте их оба в один и тот же каталог. Вам нужно будет удалить параметры аутентификации и олицетворения из файла web.config, находящегося в каталоге, и переместить их в общесистемный файл web.config (% SystemRoot% \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ web .config или аналогичный). Эти настройки должны быть заключены в теги местоположения с использованием название IIS-сайта.

Пример:

<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;
}