Код ASP.NET, чтобы определить, включена ли IIS «Проверка подлинности Windows» - PullRequest
9 голосов
/ 27 июня 2011

Я хотел бы быть в состоянии определить из кода ASP.NET, есть ли в IIS в настоящее время «доступная проверка подлинности Windows» «доступным»?

Начиная с моего приложения, установленного и в настоящий момент работающего в режиме «Анонимный доступ»,Я хочу обнаружить:

  1. Компонент «Аутентификация Windows» фактически установлен в IIS (например, в некоторых IIS7 он не установлен по умолчанию);и ...
  2. «Аутентификация Windows» на самом деле «включена» для моего виртуального корня / местоположения.

Я хочу, чтобы эта информация сообщала администратору, нужно ли ему предпринимать действияв IIS до он фактически пытается включить его в моем приложении.

(Следовательно, например, я думаю IIS7: Как определить, что аутентификация Windows включена? мне не помогает, так как он проверяет, включено ли оно для моего приложения; я хочу знать , установлено ли / можно ли его включить.)

My "Решение "должно работать (или, по крайней мере, не" терпеть неудачу ") с версиями IIS до 7, а также с самой 7-й, поэтому, если есть различия, мне нужно знать.Спасибо.

Ответы [ 5 ]

4 голосов
/ 04 апреля 2012

На странице aspx по умолчанию проверьте, задан ли для пользователя тип WindowsPrincipal. Если аутентификация Windows не включена, тип будет другим.

Также для работы аутентификации Windows браузер должен быть настроен на рукопожатие NTLM.

Добавим немного кода позже!

3 голосов
/ 31 марта 2012

Мой ответ основан на минимальных требованиях @Paul Stovell (которые нужны только для IIS 7).Когда WindowsAuthentication установлена ​​ установлена ​​, файл applicationHost.config будет иметь следующую запись в разделе <globalModules>:

<add name="WindowsAuthenticationModule" image="%windir%\System32\inetsrv\authsspi.dll" />

Использование Microsoft.Web.Administration.dll, которое можно найти в %windir%\System32\inetsrv\можно проверить наличие модуля WindowsAuthenticationModule с помощью следующего кода:

ConfigurationSection globalModulesConfig = config.GetSection("system.webServer/globalModules");
ConfigurationElementCollection globalModulesCollection = globalModulesConfig.GetCollection();
bool installed = globalModulesCollection.FirstOrDefault(a => a.GetAttribute("name").Value.Equals("WindowsAuthenticationModule")) != null;

Поскольку файл applicationHost.config находится в %windir%\System32\inetsrv\config, приложению, выполняющему этот запрос, требуются повышенные привилегии.

2 голосов
/ 15 февраля 2012

Когда включена проверка подлинности Windows, IIS возвращает этот HTTP-заголовок в ответ:

WWW-Authenticate: NTLM

Можно отправить тестовый HTTP-запрос с WebClient, дождаться его и проверить наличие заголовка.

1 голос
/ 04 апреля 2012

Следующее проверяет настройки web.config / IIS, я считаю. Вы можете добавить больше проверок в каждом экземпляре, чтобы увидеть, определены ли разделы конфигурации и т. Д. *

System.Configuration.Configuration config = WebConfigurationManager.OpenWebConfiguration("~");

SystemWebSectionGroup configSection = (SystemWebSectionGroup)config.GetSectionGroup("system.web");

AuthenticationSection auth = configSection.Authentication;

if (auth.Mode == AuthenticationMode.Forms) { }
else if (auth.Mode == AuthenticationMode.Windows) { }
1 голос
/ 27 июня 2011

Это не столько ответ, сколько просто идея указать вам возможное направление.

Веб-приложение обычно изолировано само по себе и работает с наименьшими привилегиями, поэтому я не думаю, что вы можете это сделатьсмотрите глобальные настройки, подобные этой, в ASP-коде приложения.

Я думаю, вы захотите взглянуть на классы WMI.Вы можете запросить их, используя объекты ADO или WMI.Вам может понадобиться выдать себя за более высокие учетные данные, чтобы назвать его.

См. Этот пост Статья TechNet

...