2011-06-27 77 views
9

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

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

  1. “Windows身份验证”部分实际上已安装在IIS中(例如,一些IIS7有它不 由安装默认);和...
  2. “Windows身份验证”实际上是“启用”在我的虚拟根目录/位置。

我希望这个信息,让管理员知道他是否需要采取行动以IIS 之前,他居然试图打开它在我的应用程序。

(因此,例如,我认为IIS7: How to define that windows authentication is turned on?并不能帮助我,因为这是看它是否已经在我的应用程序。我想知道是否它安装/可开启)

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

+0

什么版本的IIS需要支持?你需要支持IIS 1.0(Windows NT 3.51加载项)吗? –

+0

:-)我会*支持回到IIS 5和6,但是如果一个解决方案是7,我只能使用它来提供我可以测试的7 /不会中断较早的IIS主机。 – JonBrave

+0

对于#1,我想我可以按照http://learn.iis.net/page.aspx/135/discover-installed-components/路由和检查注册表中的“WindowsAuthentication”(就像我从安装程序“IIS元数据库兼容性”),似乎凌乱,但如果没有其他可用? 但是对于#2,我不认为注册表会告诉我? – JonBrave

回答

1

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

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

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

看到这个职位 TechNet Article

+0

谢谢,我明白你在说什么。但是,我认为这样做太复杂了,无法满足需求。 – JonBrave

2

当Windows身份验证已启用,IIS响应返回此HTTP标头:

WWW-Authenticate: NTLM 

它可以发送一个测试HTTP请求与Web客户端,等待它和检查标题的存在。

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,使这一查询的应用程序需要提升的权限。

3

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

此外,为了使Windows验证正常工作,浏览器应该配置为NTLM握手。

稍后会添加一些代码!

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) { }