C# 连接到安全Web服务

C# 连接到安全Web服务,c#,wcf,web-services,certificate,wcf-security,C#,Wcf,Web Services,Certificate,Wcf Security,我想连接由证书保护的web服务(作为服务引用) 为此,我正在这样做: ServiceClient service = new ServiceClient(); service.ClientCredentials.ClientCertificate.SetCertificate (StoreLocation.CurrentUser, StoreName.Root, X509FindType.FindBySubjectName, "Subject Name"); Servic

我想连接由证书保护的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服务方法


谢谢

根据我微弱的经验(这并不多),这意味着你的service.svc不向匿名用户开放,这让我很沮丧,因为我的所有站点都受到了NTLM保护,但是,出于某种原因,你的服务文件需要匿名

你通过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;
如果使用代理,事情可能会变得更复杂

如果你需要更多的信息,这看起来是个不错的选择