如何使用PowerShell设置IIS Windows身份验证提供程序?

时间:2013-08-19 17:48:32

标签: powershell iis-7.5 windows-authentication

有没有办法在IIS 7.5中使用PowerShell添加/删除/重新排序Windows身份验证提供程序?

我被告知,并且没有发现相反的证据,当与Windows Auth一起使用时,NTLM提供程序比协商更快。这可能与Silverlight 4,.NET 3.5,Windows 2003 Active目录和IIS6结合使用,也可能不兼容。

由于此声明已告知我,我们已升级到IIS7.5(Server 2008R2),SilverLight 5和.NET 4.5,但AD仍在2003功能级别运行。

我的目标是始终确保在IIS 7.5中已启用的提供程序列表中首先列出NTLM提供程序。

由于

2 个答案:

答案 0 :(得分:16)

可以使用powershell执行此操作。 对于我正在使用的场景,我想要配置特定站点而不是更改默认设置。 默认情况下,这在web.config中是不可能的,因为所有身份验证设置都设置为overrideModeDefault =" Deny"。这意味着需要直接对applicationhost.config进行更改。

我正在寻找的最终结果是:

<location path="MySite">
    <system.webServer>
        <security>
            <authentication>
                <anonymousAuthentication enabled="false" />
                <windowsAuthentication enabled="true">
                    <providers>
                        <clear />
                        <add value="NTLM" />
                        <add value="Negotiate" />
                    </providers>
                </windowsAuthentication>
            </authentication>
        </security>
    </system.webServer>
</location>

通过执行清除,然后按优先级顺序重新添加提供商。

首先禁用匿名身份验证并启用Windows身份验证我使用以下命令:

Set-WebConfiguration system.webServer/security/authentication/anonymousAuthentication -PSPath IIS:\ -Location MySite -Value @{enabled="False"}
Set-WebConfiguration system.webServer/security/authentication/windowsAuthentication -PSPath IIS:\ -Location MySite -Value @{enabled="True"}

然后添加<clear />标记:

Remove-WebConfigurationProperty -PSPath IIS:\ -Location MySite -filter system.webServer/security/authentication/windowsAuthentication/providers -name "."

最后,按顺序添加提供者:

Add-WebConfiguration -Filter system.webServer/security/authentication/windowsAuthentication/providers -PSPath IIS:\ -Location MySite -Value NTLM
Add-WebConfiguration -Filter system.webServer/security/authentication/windowsAuthentication/providers -PSPath IIS:\ -Location MySite -Value Negotiate

答案 1 :(得分:3)

您只能启用和禁用以下部分中提供的身份验证方法:

  

system.webServer/authentication

这是因为system.webServer/authentication不是一个集合,不支持addremove配置元素。查看IIS配置模式文件:

  

C:\Windows\System32\inetsrv\config\schema\IIS_schema.xml

搜索system.webServer/security/authentication,您会看到该部分的每个子元素都已明确定义,并且system.webServer/security/authentication本身没有定义。

关于排序,尝试更改身份验证方法顺序没有区别。例如,按以下顺序(Basic在Windows Authenticaton之前):

<system.webServer>
    <security>
        <authentication>
            <basicAuthentication enabled="true" />
            <windowsAuthentication enabled="true" />
        </authentication>
    </security>
</system.webServer>

当我交换订单时:

<system.webServer>
    <security>
        <authentication>
            <windowsAuthentication enabled="true" />
            <basicAuthentication enabled="true" />
        </authentication>
    </security>
</system.webServer>

...将始终使IIS在401挑战中向浏览器发送以下标题(使用Fiddler捕获):

HTTP/1.1 401 Unauthorized
Server: Microsoft-IIS/7.5
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
WWW-Authenticate: Basic realm="172.16.3.87"

在上面,IIS向浏览器指示它支持Kerberos,NTLM或Basic身份验证方法。开箱即用,这些身份验证方法始终按此顺序排列,无论浏览器供应商如何(我尝试过IE和Chrome)。

根据我对Fiddler的观察,IE和Chrome都尝试使用该浏览器支持的第一种方法进行协商。即在这种情况下,IE和Chrome都协商了Kerberos身份验证:

GET http://172.16.3.87:81/ HTTP/1.1
Host: 172.16.3.87:81
Connection: keep-alive
Authorization: Negotiate TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==

如果你base64解码它所说的Negotiate值:

NTLMSSP

可以通过执行以下操作删除Kerberos(Negotiate)方法:

<system.webServer>
    <security>
        <authentication>
            <windowsAuthentication enabled="true">
                <providers>
                    <remove value="Negotiate" />
                </providers>
            </windowsAuthentication>
            <basicAuthentication enabled="true" />
        </authentication>
    </security>
</system.webServer>

但是,尝试通过执行以下操作来更改这些顺序将无效:

<system.webServer>
    <security>
        <authentication>
            <windowsAuthentication enabled="true">
                <providers>
                    <remove value="Negotiate" />
                    <remove value="NTLM" />
                    <add value="NTLM" />
                    <add value="Negotiate" />
                </providers>
            </windowsAuthentication>
            <basicAuthentication enabled="true" />
        </authentication>
    </security>
</system.webServer>

您仍会按以下顺序发送WWW-Authenticate:标题:

WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
WWW-Authenticate: Basic realm="172.16.3.87"