我想连接由证书保护的Web服务(作为服务引用)。
为此我正在这样做:
ServiceClient service = new ServiceClient();
service.ClientCredentials.ClientCertificate.SetCertificate (StoreLocation.CurrentUser, StoreName.Root, X509FindType.FindBySubjectName, "Subject Name");
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidationCallBack);
service.SomeMethod();
private bool ValidationCallBack(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error)
{
return true;
}
当我调用service.SomeMethod();
方法时,它会引发异常:
“禁止使用HTTP请求 客户认证方案 '匿名'。“
这个错误意味着什么?我怎样才能避免这种情况来调用Web服务方法?
谢谢!
答案 0 :(得分:2)
您正在通过SSL进行正确的连接(我假设您的服务器需要客户端证书,通常不需要),但看起来您没有将任何凭据传递给Web服务。
尝试添加此内容:
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
这会将当前登录用户的凭据传递给服务。
只要当前用户有权访问该服务,它就会让您进入。如果对该服务具有权限的用户与当前登录的用户不同:
credentialCache cache = new CredentialCache();
cache.Add( new Uri(service.Url), // Web service URL
"Negotiate", // Kerberos or NTLM
new NetworkCredential("username", "password", "domainname") );
service.Credentials = cache;
如果您使用代理,事情会变得复杂一些。
如果您需要更多信息,答案 1 :(得分:0)
从我的微弱经验来看,这不是很多,这意味着你的service.svc不对匿名开放,这让我感到沮丧,因为我的所有网站都受到NTLM保护,但是,由于某种原因,你的服务文件需要匿名