代码之家  ›  专栏  ›  技术社区  ›  omatase

使用来自.Net 2.0的ClientCredentialType=“UserName”的WCF服务

  •  0
  • omatase  · 技术社区  · 12 年前

    我正在帮助某人使用Visual Studio Tools For Applications将Infopath应用程序连接到使用WCF编写的服务,该服务要求在SOAP标头中发送用户名和密码(clientCredentialType=“username”)。该服务正在使用basicHttpBinding。

    Infopath 2010依赖于Visual Studio Tools For Applications 2005,因此我不得不添加“Web引用”而不是“服务引用”。我以前从来没有这样做过,试图弄清楚如何做到这一点变得非常困难。

    在服务参考中,我只是说:

    service.Credentials.UserName.UserName = "username";
    service.Credentials.UserName.Password = "password";
    

    但是,当使用Web引用消费时,Credentials属性的行为会有所不同,我无法让它自动传递SOAP标头中的用户名和密码。

    我尝试了一些事情,包括这些,但没有成功:

    MyService service = new MyService();
    CredentialCache cache = new CredentialCache();
    // I've tried "Basic" and string.Empty as well in the place of "UserName"
    cache.Add(new Uri(service.Url), "UserName", new NetworkCredential("username", "password"));
    service.Credentials = cache;
    service.PreAuthenticate = true;
    
    service.MyMethod();
    

    MyService service = new MyService();
    
    service.Credentials = new NetworkCredential("username", "password");
    
    service.MyMethod();
    

    但是一点运气都没有。将整个消息记录在服务上,用户名和密码根本不包括在SOAP标头中,我收到以下错误:“验证消息的安全性时出错。”

    2 回复  |  直到 12 年前
        1
  •  1
  •   omatase    12 年前

    事实上,答案只是你不能从.Net 2.0中自动做到这一点。

        2
  •  0
  •   John Saunders    12 年前

    WCF取代ASMX是有原因的。对安全标准的支持就是其中之一。

    如果您使用的是VSTA,那么我认为您可以使用COM对象。您可以使用.NET 3.5(它只是.NET 2.0 SP2加上一些额外的库)创建COM对象。此COM对象可以使用WCF服务引用来使用该服务,但只公开COM。任何可以使用COM对象的代码都可以使用您的“代理对象”。