在IIS 7 w / Windows Server 2008上使用委派设置Kerberos身份验证

时间:2013-08-02 19:56:13

标签: authentication iis-7 active-directory kerberos

情况:

我的Web服务器上部署了一个.NET asmx Web服务。此服务在另一台服务器(我们的SharePoint服务器,如果相关)上调用服务。我想使用客户端的凭据模拟/委托从我的Web服务调用SharePoint服务。

问题:

当我调用MY Web Service并调用SharePoint时,我从SharePoint服务获得401响应。

设定:

  • 我的网络服务器正在运行IIS 7.应用程序池正在“网络服务”下运行
  • 在我的Windows Server 2003域控制器上,Web服务器已启用“Trusted for Delegation(仅限Kerberos)”。
  • 在ISS中,我的应用启用了匿名身份验证,已启用模拟,启用了Windows身份验证并启用了所有三个提供程序(协商:Kerberos,协商和NTLM)
  • SharePoint服务器设置为启用匿名,启用模拟并启用Windows身份验证,仅启用提供程序NTLM。

我可以在SharePoint日志上看到,当我在Visual Studio中本地运行时,用户名正在通过(并且服务正常工作)但是当我在Web服务器上运行时,没有用户名在日志文件上,我得到401错误

我设置错误以使Kerberos委派工作?

想法?谢谢!

3 个答案:

答案 0 :(得分:5)

<强>平台:

使用IIS7这是我在BOTH服务器上所做的。第一个服务器和第二个我们希望Kerberos身份验证“跳转”到的服务器。

第1步:

对于您正在调用其中的服务的IIS站点(在每台服务器上)进入IIS管理器,单击“连接”下左侧的站点,然后打开IIS下的“身份验证”部分。将“ASP.NET模拟”设置为“已启用”,将“Windows身份验证”设置为“已启用”。“身份验证”(Ananymous,Forms等)下的所有其他选项应设置为“已禁用”。

在“Windows身份验证”下,右键单击并选择“提供商”。将唯一的提供者设置为“Negotiate:Kerberos”(这会强制Kerberos。如果您愿意,在您获得Kerberos工作后,您可以同时使用“Negotiate”和“NTLM”提供程序并删除“Negotiate:Kerberos”,以便客户端无法Kerberos可以连接。注意:我目前已将我的设置为“Negotiate”和“NTLM”,它似乎有效)

在“Windows身份验证”下,右键单击并选择“高级设置”。取消选中“启用内核模式”框。 (我的扩展保护选项已设置为关闭,未尝试其他任何操作)

第2步:

对于每台服务器,您必须设置SPN。 SPN将是以下(A或B):

如果您的应用程序池在DOMAIN ACCOUNT的IDENTITIY下运行,请将以下SPN添加到域控制器上的域帐户

http/COMPUTER_NETBIOS_NAME 
http/COMPUTER_NETBIOS_NAME.FULLY_QUALIFIED_DOMAIN_NAME 
http://COMPUTER_NETBIOS_NAME.FULLY_QUALIFIED_DOMAIN_NAME

(如果您没有在默认端口上运行,还添加了附加端口名称的附加3个条目:http / COMPUTER_NETBIOS_NAME:PORT等。)

<强> B:

如果您的应用程序池在IDENTITY“NetworkService”下运行,则添加与上面相同的SPN,除了将“http”替换为“HOST”,然后将其添加到域控制器上的COMPUTER_NETBIOS_NAME。

我仍在努力在生产中实现这一点,但这在我的测试环境中对我有用。随着我发现更多内容,我会随时更新。

注意:

如果您在连接时直接在网址中使用COMPUTER_NETBIOS_NAME,则此方法有效。如果您直接使用别名(www.mysite.mydomain.com)或IP地址,则无效。我相信,虽然我还没有对其进行全面测试,但您必须完成上述步骤,但在添加SPN时,请使用别名或IP地址替换COMPUTER_NETBIOS_NAME。 (或者用netbios和别名/ ip添加它,不太确定)

此外,如果您在打开“ASP.NET模拟”后收到有关集成无效的设置的错误,则可能需要添加

<validation validateIntegratedModeConfiguration="false" />

到system.webServer部分的web.config

答案 1 :(得分:1)

试试这个:

Negotiate移至“提供者”列表的顶部。并且,通常在applicationHost.config下的C:\Windows\System32\inetsrv\config文件中,将useKernelMode="true" useAppPoolCredentials="true"添加到应用的<windowsAuthentication>标记下的<location>标记中,如下所示:

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

答案 2 :(得分:1)

委托需要Kerberos。您必须使用Kerberos进行SharePoint服务器支持身份验证。