【问题标题】:How to Send HTTP Auth Credentials to a non .NET WebService如何将 HTTP Auth 凭据发送到非 .NET WebService
【发布时间】:2009-09-03 22:57:13
【问题描述】:

据我所知,我正在按本书做所有事情,但是 .NET 客户端在向我的 (PHP) SOAP Web 服务发出请求时根本没有发送身份验证标头。我已经通过在 PHP 端记录原始发布数据来验证这一点,并且 .NET 从不发送任何身份验证标头。

这是我在调用我的 ExampleWebService Web 服务之前运行的代码:

ExampleWebService.PreAuthenticate = true;
NetworkCredential myCred = new NetworkCredential("myusername","mypassword");

CredentialCache myCache = new CredentialCache();
myCache.Add(new Uri(ExampleWebService.Url), "Basic", myCred);
ExampleWebService.Credentials = myCache;

据我了解,PreAuthenticate 应该在每个请求上强制发送我的 HTTP 基本身份验证凭据,而不考虑挑战。这仅适用于 IIS 托管服务吗?我在任何地方都没有发现这方面的记录。

任何在 .NET 世界中比我更有经验的人能阐明这一点,我将不胜感激,因为我快要拔掉头发了 ;-)

【问题讨论】:

    标签: .net asp.net vb.net soap


    【解决方案1】:

    HttpWebRequest 类实际上并没有在 first 请求上发送Authorization 标头,即使使用PreAuthenticate = true 也是如此。只要您使用 same CredentialsCache 实例,它就会在随后对同一领域的调用中发送 Authorization 标头。 Some recommend adding the headers explictly.

    【讨论】:

    • 这是“功能”还是“错误”? ;-)
    • 根据tools.ietf.org/html/rfc2617#page-5,是正确的行为。客户端应该从服务器获得一个挑战和一个 realm,即使是 Basic。
    • 有问题的 WebService 不存在挑战,因为身份验证是可选的,所以我认为这是问题的根本原因。其他 SOAP 客户端显然没有严格遵守规范,并且在每个请求上都强制使用凭据,因此在针对 .NET 进行测试之前我没有遇到这个问题
    • 您可以修改您的代理客户端,GetWebRequest 将授权添加到请求Headers
    • 我当然会记住这一点,但我的最终目标是让我的 PHP WebService 使用 .NET 尽可能容易使用(其中简单 == 使用代理类开箱即用Visual Studio 从 WSDL 生成),所以我可能需要重新考虑整个 HTTP 身份验证方案
    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2011-07-03
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多