【问题标题】:Connect To Secure WebService连接到安全 Web 服务
【发布时间】:2011-08-29 14:29:41
【问题描述】:

我想连接受证书保护的网络服务(作为服务参考)。

为此,我正在这样做:

    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 请求被禁止 客户端认证方案 '匿名'。”

这个错误是什么意思?以及如何避免这种调用网络服务方法?

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案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 似乎是一篇不错的文章。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-25
        • 1970-01-01
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        相关资源
        最近更新 更多