我需要以编程方式调用WCF服务。该服务可能使用NTLM或Kerberos身份验证进行托管,并且需要在两者下工作。也就是说,如果通过Kerberos连接服务失败,则应退回到NTLM。
这是我正在使用的代码来进行Kerberos身份验证(如果相关,该服务托管在SharePoint 2010中,并从Web部件中调用):
public static SiteMembershipSvc.SiteMembershipServiceClient InitialiseSiteMembershipService(string url)
{
var binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
url = url.EndsWith("/") ? url + SiteMembershipAddress : url + "/" + SiteMembershipAddress;
var endpoint = new EndpointAddress(url);
var proxy = new SiteMembershipSvc.SiteMembershipServiceClient(binding, endpoint);
proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
return proxy;
}
在NTLM环境中在代理上调用方法会出现以下错误:
HTTP请求未经授权,客户端身份验证方案为“Negotiate”。从服务器接收到的身份验证标头为“NTLM”。
注意: URL可能在另一个Web应用程序上,位于另一台服务器上。无法检查Web部件的Web应用程序以何种身份验证方式运行,并假设它与WCF服务托管的位置相同。
如何确保身份验证失败时自动或手动从Kerberos回退到NTLM?
更新:
如上所述,当调用Web方法时,会出现身份验证错误。但是,由于有多个地方调用服务中的多个Web方法,我不想等待那么久。我希望在配置代理的点(在上面的代码段中)测试身份验证。
我已尝试使用`proxy.Open()`,但似乎并没有引起故障。