从HttpHandler调用时,SharePoint搜索Web服务错误(NTLM)

时间:2010-08-12 23:59:19

标签: c# web-services sharepoint httphandler ntlm

以下是我的方案:我正在使用一个SharePoint网站,它位于一个服务器场上。在此站点中,我创建了一个HttpHandler,它使用位于不同服务器上的SharePoint搜索Web服务。所以看起来像这样:

  1. SharePoint Server A,我的网站所在的位置
    • 在服务器B上具有对SharePoint搜索Web服务的服务引用
    • 有一个使用服务引用调用搜索服务的http处理程序
  2. SharePoint Server B,搜索服务所在的位置
  3. 我的代码如下所示:

    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中唯一可以使用的是我直接提供我的凭据。有人有什么想法吗?

    感谢。

1 个答案:

答案 0 :(得分:1)

NTLM无法将凭据委托给远程服务器。

这被称为“双跃点”问题。 http://blogs.technet.com/b/askds/archive/2008/06/13/understanding-kerberos-double-hop.aspx

您必须配置Kerberos。基本上是:

  • 将SharePoint配置为使用Kerberos(在管理中心的“身份验证提供程序”中)
  • 在应用程序池帐户上创建SPN for SharePoint(使用命令行“setspn”)
  • 为运行此站点的应用程序帐户上的服务器B上运行的网站创建SPN
  • 在2
  • 之间配置委派

是的,Kerberos并不容易实现......