【问题标题】:ASP.NET code to detect whether IIS "Windows Authentication" is enabled用于检测 IIS“Windows 身份验证”是否启用的 ASP.NET 代码
【发布时间】:2011-06-27 16:10:14
【问题描述】:

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

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

  1. “Windows 身份验证”组件实际上已经安装在 IIS 中(例如某些 IIS7 没有 默认安装);还有...
  2. “Windows 身份验证”实际上是在我的虚拟根/位置上“启用”的。

我希望此信息让管理员知道他是否需要在 IIS 中采取措施在他实际尝试在我的应用程序上打开它之前

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

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

【问题讨论】:

  • 需要支持哪些版本的IIS?您需要支持 IIS 1.0(Windows NT 3.51 插件)吗?
  • :-) 我希望 like 支持回到 IIS 5 和 6,但如果解决方案只有 7,我可以接受,前提是我可以测试 7/not中断较旧的 IIS 主机。
  • 对于#1,我想我可以按照learn.iis.net/page.aspx/135/discover-installed-components 路由并检查注册表中的“WindowsAuthentication”(就像我从“IIS 元数据库兼容性”的安装程序中所做的那样),看起来很乱,但如果没有其他可用吗?但是对于#2,我认为注册表不会告诉我?
  • @JonBrave,applicationHost.config文件也可以用来判断是否安装了windows认证。您所要做的就是在 globalModules 部分中查询一个名为“WindowsAuthenticationModule”的模块(这很容易)。不幸的是,我不得不提升应用程序池身份的权限来查询 applicationHost.config 文件...

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


【解决方案1】:

我的答案基于@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】:

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

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

    稍后会添加一些代码!

    【讨论】:

      【解决方案3】:

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

      WWW-Authenticate: NTLM
      

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

      【讨论】:

        【解决方案4】:

        这与其说是一个答案,不如说是一个为您指明可能方向的想法。

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

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

        看到这篇文章 TechNet Article

        【讨论】:

        • 谢谢,我明白你在说什么。但是,我认为这太复杂了,无法满足需求。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多