使用https协议使用Web服务

时间:2014-06-13 09:58:25

标签: c# web-services wcf authentication ssl

我正在开发一个应用程序,我必须使用http协议来使用Java开发的webservice。 我正在使用C#.NET winforms开发应用程序。所有东西都工作正常,但是web服务现在使用ssl安全性,因此服务URL协议从http更改为https.now我在访问时遇到问题https webservice。

我尝试通过Auth选项卡提供Authenticaion参数(用户名和密码)从SoapUI访问https webservice,如下所示:

enter image description here

SoapUI的工作正常。

但我提供了代码中的Authenticaion参数,如下所示:

client.ClientCredentials.UserName.UserName = "admin";
client.ClientCredentials.UserName.Password = "*******";

我使用安全模式:TransportWithMessageCredential  和 ClientCredentialTtypeBasic

我的App.Config文件如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <system.serviceModel>
    <client>
      <endpoint address="https://xyz:8001/HelloWorldAPI/HelloWorldWebService"
       binding="wsHttpBinding"
        bindingConfiguration="myhttpsbinding" contract="API.HelloWorldWebService"
        name="HelloWorldWebServicePort" />
    </client>
    <bindings>
      <wsHttpBinding>
        <binding name="myhttpsbinding">
          <security mode="TransportWithMessageCredential">
            <transport clientCredentialType="Basic"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>
  <system.net>
    <defaultProxy useDefaultCredentials="true" />
  </system.net>
</configuration>

我的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using testingtool.API;

namespace testingtool
{
    class Program
    {
        static void Main(string[] args)
        {
            new APITool();
        }
    }
    class APITool
    {
        UserInfo userinfo = new UserInfo();
        HelloWorldWebServiceClient client = new HelloWorldWebServiceClient();

        private bool ValidationCallBack(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error)
        {
            return true;
        }

        public APITool()
        {
            try
            {
                //Authentication parameters
                client.ClientCredentials.UserName.UserName = "admin";
                client.ClientCredentials.UserName.Password = "*****";
                ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidationCallBack);

                //client ClientCredentials @ Application level
                userinfo.userid = "myusername";
                userinfo.password = "*****";
                GetHelloWorldAPIVersionRequest request = new GetHelloWorldAPIVersionRequest();

                APIVersionInfo versioninfo = new APIVersionInfo();
                versioninfo.userinfo = userinfo;
                request.APIVersionInfo = versioninfo;


                APIVersionInfoResponse response = client.GetHelloWorldAPIVersion(versioninfo);
                Console.WriteLine(response.Version);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            Console.ReadLine();
        }
     }
  } 

我得到以下异常:

  

System.ServiceModel.Security.MessageSecurityException:HTTP   请求未经授权使用客户端身份验证方案&#39; Anonymous&#39;。   从服务器收到的身份验证标头是“基本”   realm =&#34; EJBServiceEndpointServlet Realm&#34;&#39;。 ---&GT;   System.Net.WebException:远程服务器返回错误:(401)   未经授权的

来自客户端的

编辑我已经通过Fiddler验证了请求窗口,如下所示: 从AUth选项卡中可以看出,没有Autherization Header存在。

enter image description here

Fiddler Raw Request如下:

CONNECT 10.10.10.110:8001 
HTTP/1.1 Host: 10.10.10.110:8001 
Connection: Keep-Alive 
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

任何帮助都会非常感激。

6 个答案:

答案 0 :(得分:3)

想知道问题是否可能与绑定有关,虽然很难说没有查看服务配置或看到成功的soapUI请求。 (注意:您可能希望在soapUI HTTP日志中包含消息的片段,包括soap标头。)

在任何情况下,您可能希望通过尝试以下绑定来确保该服务确实使用ws-security(消息级安全性):

<bindings>
  <basicHttpBinding>
    <binding name="httpBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Basic" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

答案 1 :(得分:1)

您应该更改应用配置:

    <wsHttpBinding>
        <binding name="myhttpsbinding">
          <security mode="TransportWithMessageCredential">
             <transport clientCredentialType="None" />
             <message clientCredentialType="UserName" establishSecurityContext="false" negotiateServiceCredential="false"/>
          </security>
        </binding>
     </wsHttpBinding>

在传输级别,您没有身份验证,因此<transport clientCredentialType="None" />并且在消息级别上您拥有用户名|密码身份验证,因此<message clientCredentialType="UserName"

答案 2 :(得分:0)

你要通过代理服务器吗?如果是,是否将详细信息输入IE?你能浏览IE中的https页面吗?如果是,那么每个发出https呼叫的WebRequest都应该选择此项,因为它需要向代理服务器(它正在执行)发出CONNECT,但在您的呼叫中Proxy-Authorization标头丢失了。这应该是您的重点 - 尝试使用简单的WebRequest来说https:// google.com并查看您在fiddler中获得的内容。

您的代理服务器可能会因您的请求而转发问题。您是否可以在不在代理服务器后面的其他网络上尝试https?

答案 3 :(得分:0)

也许这个链接可以提供帮助。

它解释了如何在REST / SOAP WebServices

的情况下配置端点

Can not call web service with basic authentication using WCF

答案 4 :(得分:0)

我提供了 ...as effective as Azure... 内部绑定并解决了调用 HTTPS 服务的问题。完整代码:

<security mode="Transport" />

答案 5 :(得分:-1)

这里需要使用自定义绑定的绑定问题就是示例。

http://webservices20.blogspot.com/