ASP.NET代码,用于检测是否启用了IIS“Windows身份验证”

时间:2011-06-27 16:10:14

标签: asp.net iis iis-7 windows-authentication

我希望能够从ASP.NET代码中检测到IIS当前是否具有“Windows身份验证”“可用”?

从我安装的应用程序开始,当前正在“匿名访问”下运行,我想检测:

  1. “Windows身份验证”组件实际上已经安装在IIS中(例如,某些IIS7没有 默认安装);和...
  2. “Windows身份验证”实际上是“在我的虚拟根/位置上启用”。
  3. 我希望这些信息让管理员知道他是否需要在 中实际尝试在我的应用程序上启用它之前在IIS 中执行操作。

    (因此,例如,我认为IIS7: How to define that windows authentication is turned on?对我没有帮助,因为它正在查看它是否已经在我的应用程序中;我想知道是否已安装 /可以打开。)

    我的“解决方案”需要在7之前的版本以及7本身之前工作(或者至少不会“失败”),所以如果存在差异,我需要知道。感谢。

5 个答案:

答案 0 :(得分:4)

在默认的aspx页面上,检查用户是否设置为WindowsPrincipal类型。如果未启用Windows身份验证,则类型将不同。

对于Windows身份验证工作,应该为浏览器配置NTLM握手。

稍后会添加一些代码!

答案 1 :(得分:3)

我的回答是基于@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 :(得分:2)

启用Windows身份验证后,IIS将返回此HTTP标头作为响应:

WWW-Authenticate: NTLM

可以使用WebClient发送测试HTTP请求,等待它并检查标头是否存在。

答案 3 :(得分:1)

这不是一个答案,只是一个想法指出你可能的方向。

Web应用程序通常与自身隔离并以最小权限运行,因此我认为您无法从应用程序的ASP代码中看到这样的全局设置。

我猜你想要查看WMI类。您可以使用ADO或WMI对象查询它们。您可能需要冒充更高的凭据才能调用它。

看这篇文章 TechNet Article

答案 4 :(得分:1)

以下检查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) { }