【问题标题】:.NET Compact Framework, WCF service, compression and DIGEST authentication.NET Compact Framework、WCF 服务、压缩和 DIGEST 身份验证
【发布时间】:2011-09-15 08:41:36
【问题描述】:

我正在尝试将多个功能组合在一起,但由于 .NET Compact Framework 的限制,这变得越来越困难。

具体来说,我有一个 WCF 服务,我正在为它编写一个移动设备客户端。捕获?我想使用某种数据压缩(由于连接到所述设备的调制解调器非常慢)和 HTTP DIGEST 身份验证(已在托管 WCF 服务的站点上实施)。

我已关注this blog entry 以获取 WCF 服务客户端所需的压缩和生成代码。

然而,我正在为 HTTP DIGEST 苦苦挣扎。我不知道如何添加此功能。

以前我没有使用压缩,因此我使用 SOAP 连接到 WCF 服务,使用简单的 WebService 引用,并添加 HTTP DIGEST 我必须覆盖 GetWebRequest 方法并手动添加所需的标头。这一次,生成的类似乎没有多少余地,我没有太多可以覆盖的地方。此外,所有安全或身份验证参数似乎都是为 SSL 设计的,而不是此类基本身份验证方案。

总结一下:如何使用 .NET Compact Framework 使用压缩和 HTTP DIGEST 身份验证创建 WCF 客户端?

编辑: 这是我目前得到的代码:

        System.ServiceModel.Channels.CustomBinding customBinding = new System.ServiceModel.Channels.CustomBinding();
        CompressionMessageEncodingBindingElement compressionBindingElement = new CompressionMessageEncodingBindingElement();
        customBinding.Elements.Add(compressionBindingElement);
        HttpTransportBindingElement httpBindingElement = new HttpTransportBindingElement();
        customBinding.Elements.Add(httpBindingElement);
        EndpointAddress endPoint = new EndpointAddress("http://localhost:5100/Service.svc");
        ServiceClient client = new ServiceClient(customBinding, endPoint);

我怀疑我需要以某种方式将 HTTP DIGEST 功能添加到 CustomBinding 类,但我不知道如何。

我怀疑我还应该注意,当我使用 .NET Compact Framework 3.5 时,我正在创建一个 Windows CE 应用程序。因此,我没有费心去下载 Windows Mobile 6 SDK。如果这些 SDK 添加了更多可在 Window CE 应用程序中使用的功能,并且是 HTTP DIGEST 工作所必需的,请告诉我。

【问题讨论】:

  • 如果我对类似问题的回答对您有帮助,请告诉我。 stackoverflow.com/a/28998391/892836
  • @ToniRossmann 很久以前我们做那个项目的时候,我已经发布了我们使用的解决方案。也就是说,您的回答似乎忘记了我们需要启用压缩。我们的应用程序正在使用摘要,基础设施正在解决这个问题。我想您的代码可以重写以相当容易地使用 Digest(因为我们已经不得不手动完成),但我不确定这将如何组合在一起,我也无法真正检查我们的原始应用程序已经发展并且不再使用任何 Compact Framework 元素。

标签: c# wcf compact-framework windows-ce


【解决方案1】:

我们最终为运行 .NET CF 的设备禁用了 DIGEST 身份验证。它不那么安全,但我们认为在我们的案例中运行 .NET CF 的设备发送和检索的数据并不那么敏感,所以我们真正需要做的就是验证它。

【讨论】:

    【解决方案2】:

    如果客户端在 .NET Compact Framework 3.5 上运行,您可以使用 WCF 调用服务并使用内置支持 HTTP Digest 身份验证,而无需 SSL。

    以下是如何以编程方式配置 WCF 客户端以使用带有 BasicHttpBinding 的摘要式身份验证:

    var binding = new BasicHttpBinding();
    binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
    binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Digest;
    var endpoint = new EndpointAddress("http://server/myservice");
    var client = new MyServiceClient(binding, endpoint);
    
    // We have to set the actual credentials on the client proxy object
    // before invoking the service:
    client.ClientCredentials.HttpDigest.ClientCredential.UserName = "me";
    client.ClientCredentials.HttpDigest.ClientCredential.Password = "password";
    
    try
    {
        client.MyServiceOperation();
        client.Close();
    }
    catch
    {
        client.Abort();
    }
    

    相关资源:

    【讨论】:

    • 您的回复让我有点困惑。具体来说,您发布的 .config 代码。我认为这是针对移动应用程序的,但据我(可能有限)所知,Compact Framework 应用程序不支持 App.config。因此,我需要手动设置所有这些绑定在代码中。您似乎也忘记了我需要使用前面提到的压缩,这意味着我需要使用 CustomBinding 类。我将编辑我的问题以包含更多详细信息。
    • @Shaamaan 绝对正确,.NET Compact Framework 不支持应用程序配置文件。我更新了我的答案。
    • 很可能我的系统中缺少一些重要的 SDK,或者您忘记了这是 .NET Compact Framework。例如,您可以看到herehereHttpTransportBindingElementAuthenticationScheme 属性在 CFW 中不可用,事实上,Visual Studio 无法识别这些属性。
    • @Shaamaan 实际上我忘了检查紧凑框架是否支持HttpTransportBindingElement.AuthenticationScheme。在这一点上,我唯一的结论是,在 Compact Framework 上可能无法实现您所要求的。您可能需要寻找一种替代方法来实现不涉及自定义绑定的压缩。
    • 谢谢。但是,我想指出您使用BasicHttpBinding 的建议也存在缺陷。 CFW 中缺少TransportCredentialOnly 模式和Digest 凭据类型(HttpClientCredentialTypeWebHttpSecurityMode)。因此,您链接的 PDF 似乎对 DIGEST 完全错误,除非它是手动实现的。如果有办法以一种简单的方式实现 DIGEST,我很想知道。
    【解决方案3】:

    实现此目的的唯一方法是使用 HttpWebRequest(手动)并指定 ClientCredentials,而不是从不支持身份验证的 NetCFSvcUtil 生成的类。 它在带有 WCF 的 CF 上支持的唯一 WS-Security 规范是通过相互证书交换有效地使用消息安全性。 (顺便说一句,我和一个同事发现了内存泄漏:http://connect.microsoft.com/VisualStudio/feedback/details/727247/native-memory-leak-in-wcf-proxy-client-with-mutual-certificate-security-in-net-compact-framework-3-5-on-windows-ce-6-0

    值得注意的是,生成的CFClientBase 也有内存泄漏,可以解决,请参阅:http://geekswithblogs.net/GruffCode/archive/2013/03/31/memory-leak-in-cfclientbaselttgt-service-proxy-for-compact-framework-.net.aspx

    供参考:NetCF支持的WCF子集:http://blogs.msdn.com/b/andrewarnottms/archive/2007/08/21/the-wcf-subset-supported-by-netcf.aspx

    【讨论】:

      猜你喜欢
      • 2020-07-04
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多