我在我的Web服务器上部署了一个.NET asmx Web服务.此服务在另一台服务器(我们的SharePoint服务器,如果相关)上调用服务.我想通过使用客户端的凭据模拟/委派从我的Web服务调用SharePoint服务.
问题:
当我调用MY Web Service并调用SharePoint时,我从SharePoint服务获得401响应.
建立:
>我的Web服务器正在运行IIS 7.应用程序池在“网络服务”下运行
>在我的Windows Server 2003域控制器上,Web服务器已启用“Trusted for Delegation(仅限Kerberos)”.
>在ISS中,我的应用程序启用了匿名身份验证,启用了模拟,并启用了所有三个提供程序的Windows身份验证(协商:Kerberos,Negotiate和NTLM)
> SharePoint服务器设置为启用匿名,启用模拟并启用Windows身份验证,仅启用提供程序NTLM.
我可以在SharePoint日志上看到,当我在Visual Studio中本地运行时,用户名正在通过(并且服务正常工作)但是当我在Web服务器上运行时,没有用户名在日志文件上,我收到401错误
我设置错误使Kerberos委派工作的原因是什么?
想法?谢谢!
使用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):
A:
如果您的应用程序池在DOMAIN ACCOUNT的IDENTITIY下运行,请将以下SPN添加到域控制器上的THAT DOMAIN ACCOUNT
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.
我仍在努力在生产中实现这一点,但这在我的测试环境中对我有用.随着我发现更多信息,我会随时更新.
注意:
如果您在连接时直接在URL中使用COMPUTER_NETBIOS_NAME,则此方法有效.如果您直接使用别名(www.mysite.mydomain.com)或IP地址,则无效.我相信,虽然我还没有对其进行全面测试,但您必须完成上述步骤,但在添加SPN时,请使用别名或IP地址替换COMPUTER_NETBIOS_NAME. (或者用netbios和别名/ ip添加它,不是很确定)
此外,如果您在打开“ASP.NET模拟”后收到有关集成无效的设置的错误,则可能需要添加
<validation validateIntegratedModeConfiguration="false" />
到system.webServer部分的web.config