连接到安全Web服务

时间:2011-05-20 11:35:10

标签: c# wcf web-services certificate wcf-security

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

谢谢!

2 个答案:

答案 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;

如果您使用代理,事情会变得复杂一些。

如果您需要更多信息,

http://man.ddvip.com/web/bsaspnetapp/LiB0087.html似乎是一个好的写作。

答案 1 :(得分:0)

从我的微弱经验来看,这不是很多,这意味着你的service.svc不对匿名开放,这让我感到沮丧,因为我的所有网站都受到NTLM保护,但是,由于某种原因,你的服务文件需要匿名