.net - 通过 HTTP 将用户名和密码以明文形式发送到 Web 服务

标签 .net xml vb.net wcf web-services

我有一个使用 Web 服务的 VB.NET (2008) 控制台应用程序。我最初开始使用旧的/遗留的(WCF 之前)技术来编写它,即使用 WSDL.exe(或 Visual Studio 中的“添加 Web 服务”)导入 WSDL,该技术基于 System.Web.Services.Protocols.SoapHttpClientProtocol 创建类。然而,我很快意识到这不是最好的方法(感谢 John Saunders 在我上一个问题中的评论 - How to get serialized XML of object passed to web service? )。

所以,我现在已经将代码转换为 WCF(使用“添加服务引用”,它创建基于 System.ServiceModel.ClientBase 的类);它的工作原理或多或少相同,除了一个关键点:安全性。

我正在使用的 Web 服务是用 Java 编写的;虽然我们(我和开发 Web 服务的团队)都在同一家公司工作,但我对他们如何发布和公开 Web 服务并没有太多控制权。他们的要求是我通过 HTTP(而不是 HTTPS)传递用户名和密码(基本 HTTP 身份验证)。我知道这不是最安全的方法;但这是一场我现在无法参加的战斗。

使用旧方法效果很好。但如果我尝试通过在 app.config 中设置 WCF 来执行此操作:

<security mode="Transport">
    <transport clientCredentialType="Basic" />
</security>

...并在如下代码中设置用户名和密码:

oServiceClient.ClientCredentials.UserName.UserName = "SomeUsername"
oServiceClient.ClientCredentials.UserName.Password = "SomePassword"

我有礼貌地向我抛出了这个异常:

System.ArgumentException: The provided URI scheme 'http' is invalid; expected 'https'. Parameter name: via

这太糟糕了;在 .NET 3.5 中搜索 StackOverflow 和其他站点并没有发现太多解决此问题的方法。我发现了我认为可能有希望的东西( http://webservices20.blogspot.com/2008/11/introducing-wcf-clearusernamebinding.html );然而,看起来这个解决方案需要在服务端和客户端上进行配置更改。正如前面提到的,我对此的服务器端没有任何控制权。

有没有办法使用基于 WCF 的客户端来完成此任务?还是我需要放弃并回到老路?

编辑:我似乎在这方面取得了一些成功:

<security mode="TransportCredentialOnly">
    <transport clientCredentialType="Basic" />
    <message clientCredentialType="UserName" />
</security>

但是微软帮助文章/教程中似乎没有引用这种安全模式(TransportCredentialOnly)。我对树吠叫了吗?

最佳答案

就我而言,解决方案是将安全模式设置为“TransportCredentialOnly”,如下所示:

<security mode="TransportCredentialOnly">
    <transport clientCredentialType="Basic" proxyCredentialType="None"
        realm="" />
    <message clientCredentialType="UserName" algorithmSuite="Default" />
</security>

感谢 evgenyl 促使我向其他安全模式开放我的研究;但最终,是“TransportCredentialOnly”而不是“Message”成功了。

关于.net - 通过 HTTP 将用户名和密码以明文形式发送到 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16116211/

相关文章:

c# - 将 CollectionViewSource 绑定(bind)到 ListBox

c# - 从字节数组打开文件

C# NullReference 异常和 ReSharper 建议

c# - 报告哈希进度

c# - 用于限制可以为属性设置的值的结构化代码

java 查找 xml 属性的值

python - 如何从 python 获取(解析)XML 中的子项

c# - 将 XML 反序列化为对象 - XML 文档 (0, 0) 中存在错误

c# - 将大型 ASP.NET VB.NET 项目转换为 C# - 增量?

asp.net - IIS 经典模式 .NET Web API 调用返回 404 错误