Windows 身份验证 <windowsAuthentication>

概述

<windowsAuthentication> 元素定义 Internet Information Services (IIS) 7 Windows 身份验证模块的配置设置。 如果 IIS 7 服务器在公司网络上运行,而公司网络使用 Microsoft Active Directory 服务域标识或其他 Windows 帐户来标识,则可以使用 Windows 身份验证。 因此,无论服务器是否是 Active Directory 域的成员,你都可以使用 Windows 身份验证。

Windows 身份验证(以前命名为 NTLM,也称为 Windows NT 质询/响应身份验证)是一种安全形式的身份验证,因为用户名和密码在通过网络发送之前经过哈希处理。 启用 Windows 身份验证时,客户端浏览器会在与 Web 服务器的加密交换中发送密码的强哈希版本。

Windows 身份验证支持两种身份验证协议:Kerberos 和 NTLM,身份验证协议是在 <providers> 元素中定义的。 在 IIS 7 上安装和启用 Windows 身份验证时,默认协议为 Kerberos。 <windowsAuthentication> 元素还可以包含 useKernelMode 属性,该属性配置是否使用 Windows Server 2008 中新增的内核模式身份验证功能。

Windows 身份验证最适合 Intranet 环境,原因如下:

  • 客户端计算机和 Web 服务器位于同一域中。
  • 管理员可以确保每个客户端浏览器都是 Internet Explorer 2.0 或更高版本。
  • 不需要 HTTP 代理连接(NTLM 不支持)。
  • Kerberos 版本 5 需要连接到 Active Directory,这在 Internet 环境中不可行。

IIS 7.5 中的新增功能

IIS 7.5 中引入了 <extendedProtection> 元素,可用于配置已集成到 Windows 身份验证的新扩展保护功能的设置。

兼容性

版本 说明
IIS 10.0 <windowsAuthentication> 元素在 IIS 10.0 中未进行修改。
IIS 8.5 <windowsAuthentication> 元素在 IIS 8.5 中未进行修改。
IIS 8.0 <windowsAuthentication> 元素在 IIS 8.0 中未进行修改。
IIS 7.5 IIS 7.5 中添加了 <extendedProtection> 元素。
IIS 7.0 <windowsAuthentication> 元素是在 IIS 7.0 中引入的。
IIS 6.0 <windowsAuthentication> 元素取代了 IIS 6.0 的 AuthTypeAuthFlags 元数据库属性。

安装

IIS 7 及更高版本的默认安装不包括 Windows 身份验证角色服务。 要在 IIS 上使用 Windows 身份验证,必须安装角色服务,为网站或应用程序禁用匿名身份验证,然后为网站或应用程序启用 Windows 身份验证。

注意

安装角色服务后,IIS 7 会将以下配置设置提交到 ApplicationHost.config 文件。

<windowsAuthentication enabled="false" />

Windows Server 2012 或 Windows Server 2012 R2

  1. 在任务栏上,单击 “服务器管理器”。
  2. 在“服务器管理器”中,单击“管理”菜单,然后单击“添加角色和功能”。
  3. 在“添加角色和功能”向导中,单击“下一步”。 选择安装类型,然后单击“下一步”。 选择目标服务器,然后单击“下一步”。
  4. 在“服务器角色”页上,依次展开“Web 服务器 (IIS)”、“Web 服务器”和“安全性”,然后选择“Windows 身份验证”。 单击 “下一步”
    Screenshot of the Server Roles page with the Windows Authentication option being highlighted.
  5. 在“选择功能”页上,单击“下一步”
  6. “确认安装选择”页上,单击“安装”
  7. 在“结果” 页面中单击“关闭”

Windows 8 或 Windows 8.1

  1. 在“开始”屏幕上,将指针一直移动到左下角,右键单击“开始”按钮,然后单击“控制面板”
  2. 在“控制面板”中,单击“程序与功能”,然后单击“打开或关闭 Windows 功能”。
  3. 依次展开“Internet 信息服务”、“万维网服务”和“安全性”,然后选择“Windows 身份验证”。
    Screenshot of the Internet Information Services folder's contained folders, with the Windows Authentication folder being highlighted.
  4. 单击“确定”。
  5. 单击“关闭” 。

Windows Server 2008 或 Windows Server 2008 R2

  1. 在任务栏上,单击“开始”,指向“管理工具”,然后单击“服务器管理器”。
  2. 在“服务器管理器”层次结构窗格中,展开“角色”,然后单击“Web 服务器 (IIS)”。
  3. 在“Web 服务器 (IIS)”窗格中,滚动到“角色服务”部分,然后单击“添加角色服务”。
  4. 在“添加角色服务向导”的“选择角色服务”页上,选择“Windows 身份验证”,然后单击“下一步”。
    Screenshot of the Select Role Services page with the Windows Authentication option being highlighted.
  5. “确认安装选择”页中,单击“安装”
  6. 在“结果” 页面中单击“关闭”

Windows Vista 或 Windows 7

  1. 在任务栏上,单击“开始”,然后单击“控制面板”。
  2. 在“控制面板”中,单击“程序与功能”,然后单击“打开或关闭 Windows 功能”。
  3. 扩展“Internet Information Services”,展开“万维网服务”,然后展开“安全性”。
  4. 选择“Windows 身份验证”,然后单击“确定”。
    Screenshot of the expandable Internet Information Services folder with the Windows Authentication folder being highlighted.

操作方式

如何为网站、Web 应用程序或 Web 服务启用 Windows 身份验证

  1. 打开 Internet Information Services (IIS) 管理器:

    • 如果使用的是 Windows Server 2012 或 Windows Server 2012 R2:

      • 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS)管理器”
    • 如果使用的是 Windows 8 或 Windows 8.1:

      • 按住 Windows 键,按字母 X,然后单击“控制面板”。
      • 单击“管理工具”,然后双击“Internet 信息服务(IIS)管理器”。
    • 如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:

      • 在任务栏上,单击“开始”,指向“管理工具”,然后单击“Internet Information Services (IIS)管理器”
    • 如果使用的是 Windows Vista 或 Windows 7:

      • 在任务栏上,单击“开始”,然后单击“控制面板”。
      • 双击“管理工具”,然后双击“Internet 信息服务(IIS)管理器”。
  2. 在“连接”窗格中,展开服务器名称,展开“站点”,然后展开要为其启用 Windows 身份验证的站点、应用程序或 Web 服务。

  3. 滚动到“主页”窗格中的“安全性”部分,然后双击“身份验证”。

  4. 在“身份验证”窗格中,选择“Windows 身份验证”,然后单击“操作”窗格中的“启用”。
    Screenshot of the Authentication pane which contains the Name and Status fields.


如何为 Windows 身份验证启用扩展保护

  1. 打开 Internet Information Services (IIS) 管理器:

    • 如果使用的是 Windows Server 2012 或 Windows Server 2012 R2:

      • 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS)管理器”
    • 如果使用的是 Windows 8 或 Windows 8.1:

      • 按住 Windows 键,按字母 X,然后单击“控制面板”。
      • 单击“管理工具”,然后双击“Internet 信息服务(IIS)管理器”。
    • 如果使用的是 Windows Server 2008 或 Windows Server 2008 R2:

      • 在任务栏上,单击“开始”,指向“管理工具”,然后单击“Internet Information Services (IIS)管理器”
    • 如果使用的是 Windows Vista 或 Windows 7:

      • 在任务栏上,单击“开始”,然后单击“控制面板”。
      • 双击“管理工具”,然后双击“Internet 信息服务(IIS)管理器”。
  2. 在“连接”窗格中,展开服务器名称、“站点”,然后展开要为其启用 Windows 身份验证扩展保护的站点、应用程序或 Web 服务。

  3. 滚动到“主页”窗格中的“安全性”部分,然后双击“身份验证”。

  4. 在“身份验证”页中,选择“Windows 身份验证”。

  5. 在“操作”窗格中单击“启用”
    Screenshot of the Authentication pane and its Group by field.

  6. 在“操作”窗格中,单击“高级设置”

  7. 出现“高级设置”对话框时,在“扩展保护”下拉菜单中选择以下选项之一:

    • 如果要启用扩展保护,同时为不支持扩展保护的客户端提供下层支持,请选择“接受”。
    • 如果要启用扩展保护而不提供下层支持,请选择“必需”。
      Screenshot of the Advanced Settings dialog box with the Extended Protection field's Accept option being highlighted.
  8. 单击“确定”,关闭“高级设置”对话框。

配置

<windowsAuthentication> 元素可在 ApplicationHost.config 文件中进行配置(在站点、应用程序或虚拟目录级别)。

特性

属性 说明
authPersistNonNTLM 可选的 Boolean 属性。

指定 IIS 是否自动重新验证每个非 NTLM请求( 例如 Kerberos),即使是同一连接上的请求。 False 可为同一连接启用多个身份验证。

注意:若设置为 true,则表示客户端在同一连接上只会进行一次身份验证。 IIS 将在服务器上为已建立的 TCP 会话缓存令牌或票证。

默认为 false
authPersistSingleRequest 可选的 Boolean 属性。

将此标志设置为 true 可指定仅针对连接上的单个请求保留身份验证。 IIS 会在每个请求结束时重置身份验证,并强制对会话的下一个请求重新进行身份验证。

默认值为 false
enabled 必需的 Boolean 特性。

指定是否启用 Windows 身份验证。

默认值为 false
useKernelMode 可选的 Boolean 属性。

指定 Windows 身份验证是否在内核模式下完成。 True 指定 Windows 身份验证使用内核模式。

内核模式身份验证可以提高身份验证性能,并防止配置为使用自定义标识的应用程序池出现身份验证问题。

如果使用 Kerberos 身份验证,并且应用程序池上有自定义标识,最佳做法是不禁用此设置。

默认值为 true

子元素

元素 说明
extendedProtection 可选元素。

指定 Windows 身份验证的扩展保护选项。

注意:IIS 7.5 中添加了此元素。
providers 可选元素。

指定用于 Windows 身份验证的安全支持提供程序。

配置示例

以下默认 <windowsAuthentication> 元素是在 IIS 7.0 中的根 ApplicationHost.config 文件中配置,默认禁用 Windows 身份验证。 此元素还定义了 IIS 7.0 的两个 Windows 身份验证提供程序。

<windowsAuthentication enabled="false">
   <providers>
      <add value="Negotiate" />
      <add value="NTLM" />
   </providers>
</windowsAuthentication>

以下示例为名为 Contoso 的网站启用 Windows 身份验证并禁用匿名身份验证。

<location path="Contoso">
   <system.webServer>
      <security>
         <authentication>
            <anonymousAuthentication enabled="false" />
            <windowsAuthentication enabled="true" />
         </authentication>
      </security>
   </system.webServer>
</location>

代码示例

以下示例为名为 Contoso 的站点禁用匿名身份验证,然后为站点启用 Windows 身份验证。

AppCmd.exe

appcmd.exe set config "Contoso" -section:system.webServer/security/authentication/anonymousAuthentication /enabled:"False" /commit:apphost

appcmd.exe set config "Contoso" -section:system.webServer/security/authentication/windowsAuthentication /enabled:"True" /commit:apphost

注意

使用 AppCmd.exe 配置这些设置时,必须确保将 commit 参数设置为 apphost。 这会将配置设置提交到 ApplicationHost.config 文件中的相应位置部分。

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample {

   private static void Main() {

      using(ServerManager serverManager = new ServerManager()) { 
         Configuration config = serverManager.GetApplicationHostConfiguration();

         ConfigurationSection anonymousAuthenticationSection = config.GetSection("system.webServer/security/authentication/anonymousAuthentication", "Contoso");
         anonymousAuthenticationSection["enabled"] = false;

         ConfigurationSection windowsAuthenticationSection = config.GetSection("system.webServer/security/authentication/windowsAuthentication", "Contoso");
         windowsAuthenticationSection["enabled"] = true;

         serverManager.CommitChanges();
      }
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample
   Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetApplicationHostConfiguration

      Dim anonymousAuthenticationSection As ConfigurationSection = config.GetSection("system.webServer/security/authentication/anonymousAuthentication", "Contoso")
      anonymousAuthenticationSection("enabled") = False

      Dim windowsAuthenticationSection As ConfigurationSection = config.GetSection("system.webServer/security/authentication/windowsAuthentication", "Contoso")
      windowsAuthenticationSection("enabled") = True

      serverManager.CommitChanges()
   End Sub
End Module

JavaScript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";

var anonymousAuthenticationSection = adminManager.GetAdminSection("system.webServer/security/authentication/anonymousAuthentication", "MACHINE/WEBROOT/APPHOST/Contoso");
anonymousAuthenticationSection.Properties.Item("enabled").Value = false;

var windowsAuthenticationSection = adminManager.GetAdminSection("system.webServer/security/authentication/windowsAuthentication", "MACHINE/WEBROOT/APPHOST/Contoso");
windowsAuthenticationSection.Properties.Item("enabled").Value = true;

adminManager.CommitChanges();

VBScript

Set adminManager = CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"

Set anonymousAuthenticationSection = adminManager.GetAdminSection("system.webServer/security/authentication/anonymousAuthentication", "MACHINE/WEBROOT/APPHOST/Contoso")
anonymousAuthenticationSection.Properties.Item("enabled").Value = False

Set windowsAuthenticationSection = adminManager.GetAdminSection("system.webServer/security/authentication/windowsAuthentication", "MACHINE/WEBROOT/APPHOST/Contoso")
windowsAuthenticationSection.Properties.Item("enabled").Value = True

adminManager.CommitChanges()