从 .Net 2.0 使用 ClientCredentialType="UserName" 的 WCF 服务

Posted

技术标签:

【中文标题】从 .Net 2.0 使用 ClientCredentialType="UserName" 的 WCF 服务【英文标题】:Consuming a WCF Service With ClientCredentialType="UserName" From .Net 2.0 【发布时间】:2012-09-14 15:53:11 【问题描述】:

我正在帮助某人使用 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 Reference 消费时,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 标头中,我收到以下错误:“验证消息安全性时发生错误。”

【问题讨论】:

嗨,这有什么好运气吗?我需要类似的东西。就我而言,我正在寻找一种方法让 java 应用程序在soap 标头中传递用户/密码,以由 wcf 服务进行验证。谢谢! 答案真的只是你不能从 .Net 2.0 自动完成。然而,在 Java 的情况下,答案可能完全不同。通过手动构建 SOAP 并发布到服务器,我在 android 应用程序(当然是 Java)中走了一条懒惰的路线。 【参考方案1】:

答案真的是你不能从 .Net 2.0 自动完成。

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于从 .Net 2.0 使用 ClientCredentialType="UserName" 的 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何将项目从 .NET 3.5 降级到 .NET 2.0?

如何使用 Visual Studio 2010 将项目从 .Net 2.0 升级到 .Net 4.0?

从 .Net 2.0 使用 ClientCredentialType="UserName" 的 WCF 服务

从 .net 核心控制台应用程序引用 .net 标准 2.0 库中的 dll 时出错

从 Visual Studio 2005 迁移到 2008 和 .NET 2.0

使用 System.IdentityModel.Tokens.Jwt 从 1.1 迁移到 2.0 后,JWTAuthentication 在 asp.net core 2.0 中不起作用 - 5.1.