代码之家  ›  专栏  ›  技术社区  ›  TehOne

从HttpHandler调用时出现SharePoint搜索web服务错误(NTLM)

  •  0
  • TehOne  · 技术社区  · 14 年前

    下面是我的场景:我有一个正在处理的SharePoint站点,它位于一个服务器场上。在这个站点中,我创建了一个HttpHandler,它使用位于不同服务器上的SharePoint搜索webservice。看起来是这样的:

    1. 我的网站所在的SharePoint Server A
      • 对服务器B上的SharePoint搜索web服务具有服务引用
    2. 搜索服务所在的SharePoint服务器B

    我的代码如下所示:

    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();
    

    客户端身份验证方案“Ntlm”。 来自服务器的是“NTLM”。

    我已经尝试了上述代码的多种不同组合,只有当我直接提供凭据时,HttpHandler才起作用。有人有什么想法吗?

    谢谢。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Nico    14 年前

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

    http://blogs.technet.com/b/askds/archive/2008/06/13/understanding-kerberos-double-hop.aspx

    您必须配置Kerberos。基本上:

    • 配置SharePoint以使用Kerberos(在管理中心的“身份验证提供程序”中)
    • 在运行此网站的应用程序帐户上为服务器B上的网站runnong创建SPN