以下是我的方案:我正在使用一个SharePoint网站,它位于一个服务器场上。在此站点中,我创建了一个HttpHandler,它使用位于不同服务器上的SharePoint搜索Web服务。所以看起来像这样:
我的代码如下所示:
BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
QueryServiceSoapClient _queryService = new QueryServiceSoapClient(binding, new EndpointAddress("http://easearch.ea.com/_vti_bin/search.asmx"));
_queryService.ClientCredentials.Windows.AllowNtlm = true;
_queryService.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
_queryService.ClientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
//_queryService.ClientCredentials.Windows.ClientCredential = new NetworkCredential("MyUsername", "MyPassword", "MyDomain"); //This is the only way it seems to work
//NetworkCredential userCredential = CredentialCache.DefaultCredentials.GetCredential(_queryService.Endpoint.ListenUri, "NTLM");
//_queryService.ClientCredentials.Windows.ClientCredential = userCredential;
string status = _queryService.Status();
如果我在开发框中使用来自控制台应用程序的代码,它会按预期工作。但是当我尝试使用来自我的http处理程序的相同代码时,它会给出错误
HTTP请求未经授权 客户端身份验证方案'Ntlm'。 收到身份验证标头 来自服务器的是'NTLM'。
我已经尝试了上面代码的许多不同组合,而且我的HttpHandler中唯一可以使用的是我直接提供我的凭据。有人有什么想法吗?
感谢。
答案 0 :(得分:1)
NTLM无法将凭据委托给远程服务器。
这被称为“双跃点”问题。 http://blogs.technet.com/b/askds/archive/2008/06/13/understanding-kerberos-double-hop.aspx
您必须配置Kerberos。基本上是:
是的,Kerberos并不容易实现......