WCF BasicHttpBinding 安全解析(1)BasicHttpBinding基本配置

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介:

BasicHttpBinding使用HTTP作为传输协议用于发送SOAP 1.1消息。服务可以使用此绑定来公开符合WS-I BP 1.1标准的终结点,如ASMX客户端访问的终结点。同样,客户端可以使用BasicHttpBinding与公开符合WS-I BP 1.1标准的终结点的服务(如 ASMX Web服务或采用BasicHttpBinding 配置的服务)进行通信。

默认情况下,安全性处于禁用状态,但是通过在BasicHttpBinding(BasicHttpSecurityMode)构造函数中将BasicHttpSecurityMode设置为不同于None的值,可以添加安全性。默认情况下,它使用“Text”消息编码和 UTF-8文本编码。

基于在11.2节我们使用的HelloService服务,我们这里使用BasicHttpBinding来对外发布它。

服务代码与之之前没有什么变化,如代码清单11-68。

代码清单11-68 HelloService服务

   1:  public class HelloService : IHelloService
   2:   
   3:      {
   4:   
   5:  public string GetHello()
   6:   
   7:          {
   8:   
   9:  if (ServiceSecurityContext.Current != null)
  10:   
  11:              {
  12:   
  13:  if (!ServiceSecurityContext.Current.IsAnonymous)
  14:   
  15:                  {
  16:   
  17:  return "Hello:" + ServiceSecurityContext.Current.PrimaryIdentity.Name + ";type="
  18:   
  19:                          + ServiceSecurityContext.Current.PrimaryIdentity.AuthenticationType;
  20:   
  21:                  }
  22:   
  23:  return "";
  24:   
  25:              }
  26:   
  27:  else
  28:   
  29:              {
  30:   
  31:  return "hello";
  32:   
  33:              }
  34:   
  35:          }
  36:   
  37:      }
  38:   

我们新建一个控制台项目,名为“basicHttpBindingHost”,用户做自定义宿主。宿主的配置如代码清单11-69。

代码清单11-69 服务宿主配置

   1:  <?xml version="1.0"?>
   2:   
   3:  <configuration>
   4:   
   5:    <system.serviceModel>
   6:   
   7:        <services>
   8:   
   9:        <service name="WcfSecurityExampleServiceLibrary.HelloService" behaviorConfiguration="mex" >
  10:   
  11:          <host>
  12:   
  13:            <baseAddresses >
  14:   
  15:              <add baseAddress="http://127.0.0.1:64567/"/>
  16:   
  17:            </baseAddresses>
  18:   
  19:          </host>
  20:   
  21:          <endpoint address="http://127.0.0.1:64567/HelloService" binding="basicHttpBinding"
  22:   
  23:  name="basicHttpHelloEndPoint"
  24:   
  25:  contract="WcfSecurityExampleServiceLibrary.IHelloService"  />
  26:   
  27:          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
  28:   
  29:        </service>
  30:   
  31:      </services>
  32:   
  33:      <behaviors>
  34:   
  35:        <serviceBehaviors>
  36:   
  37:          <behavior name="mex">
  38:   
  39:            <serviceMetadata/>
  40:   
  41:          </behavior>
  42:   
  43:        </serviceBehaviors>
  44:   
  45:      </behaviors>
  46:   
  47:    </system.serviceModel>
  48:   
  49:    <startup>
  50:   
  51:      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  52:   
  53:    </startup>
  54:   
  55:  </configuration>
  56:   

看代码清单11-69所示的配置,我们通过

   1:  <endpoint address="http://127.0.0.1:64567/HelloService" binding="basicHttpBinding"
   2:   
   3:  name="basicHttpHelloEndPoint"
   4:   
   5:  contract="WcfSecurityExampleServiceLibrary.IHelloService"  />

来设置当前终结点的绑定为basicHttpBinding,契约为WcfSecurityExampleServiceLibrary.IHelloService,并通过元数据终结点对外发布服务。宿主的代码如代码清单11-70所示。

代码清单11-70 服务宿主的实现

   1:  class Program
   2:   
   3:          {
   4:   
   5:  static void Main(string[] args)
   6:   
   7:              {
   8:   
   9:  ServiceHost hostForHello = new ServiceHost(typeof(HelloService));
  10:   
  11:                  hostForHello.Open(); 
  12:   
  13:  try
  14:   
  15:                  {
  16:   
  17:  while (true)
  18:   
  19:                      {
  20:   
  21:                      }
  22:   
  23:                  }
  24:   
  25:  catch
  26:   
  27:                  {
  28:   
  29:                      hostForHello.Abort();
  30:   
  31:                  }
  32:   
  33:              }
  34:   
  35:          }
  36:   

启动宿主程序,我们在浏览器中输入http://127.0.0.1:64567/,结果如图11-27。

clip_image002

图11-27 服务启动成功

从如11-27的结果我们可以看出服务启动成功并在指定端口监听。下面我们构造客户端,首先看客户端配置文件,如代码清单11-71。

代码清单11-71 客户端配置

   1:  <?xml version="1.0" encoding="utf-8" ?>
   2:   
   3:  <configuration>
   4:   
   5:    <system.serviceModel>
   6:   
   7:      <client>
   8:   
   9:             <endpoint address="http://127.0.0.1:64590/HelloService" binding="basicHttpBinding"
  10:   
  11:  contract="WcfSecurityExampleServiceLibrary.IHelloService" name="basicHttpHelloEndPoin"/>
  12:   
  13:      </client>
  14:   
  15:    </system.serviceModel>
  16:   
  17:  </configuration>

如代码清单11-71,客户端的配置很简单,只是指定终结点和契约,其他的配置采用默认配置。这里需要注意的是终结点指定的address=http://127.0.0.1:64590/HelloService,端口64590是我使用TcpTrace进行监听的端口,如图11-28。这里没有使用netTcpBinding在Behavior中设置的原因为BasicHttpBinding的AddressingVersion值为None,MessageVersion是不能改变的,只有CustomBinding才支持textMessageEncoding的设定。

clip_image004

11-28 tctTrace监听转发消息

客户端调用代码如代码清单11-72。

代码清单11-72 客户端调用代码

   1:  class Program
   2:   
   3:      {
   4:   
   5:  static void Main(string[] args)
   6:   
   7:          {
   8:   
   9:  using (ChannelFactory<IHelloService> channelFactory = new ChannelFactory<IHelloService>("basicHttpHelloEndPoint"))
  10:   
  11:              {
  12:   
  13:  IHelloService helloService = channelFactory.CreateChannel();
  14:   
  15:  using (helloService as IDisposable)
  16:   
  17:                  {
  18:   
  19:  Console.WriteLine(helloService.GetHello());
  20:   
  21:                  }
  22:   
  23:              }
  24:   
  25:  Console.Read();
  26:   
  27:          }
  28:   
  29:      }

调用代码和之前使用的并无差别,这里就不详说了。我们直接看运行结果,如图11-29。

clip_image006

图11-29 客户端运行结果

我们的服务返回的信息应该包含客户端用户名和验证类型,但是图11-29中没有这两项信息,原因在于默认情况下BasicHttpBinding不采用任何安全配置。我们再来看tcpTrace的监听结果,如图11-30。

clip_image008

图11-30 tcpTrace监听信息

从图11-30的监听结果来看,采用的是明文传输,编码格式为“text/xml”,没有任何认证和凭据信息。

一个完整的BasicHttpBinding的示例到这里演示完毕了,下面我们对它做进一步的分析。


本文转自悬魂博客园博客,原文链接:http://www.cnblogs.com/xuanhun/archive/2011/06/27/2091262.html,如需转载请自行联系原作者

相关文章
|
1月前
|
机器学习/深度学习 安全 大数据
揭秘!企业级大模型如何安全高效私有化部署?全面解析最佳实践,助你打造智能业务新引擎!
【10月更文挑战第24天】本文详细探讨了企业级大模型私有化部署的最佳实践,涵盖数据隐私与安全、定制化配置、部署流程、性能优化及安全措施。通过私有化部署,企业能够完全控制数据,确保敏感信息的安全,同时根据自身需求进行优化,提升计算性能和处理效率。示例代码展示了如何利用Python和TensorFlow进行文本分类任务的模型训练。
93 6
|
1月前
|
机器学习/深度学习 人工智能 安全
TPAMI:安全强化学习方法、理论与应用综述,慕工大、同济、伯克利等深度解析
【10月更文挑战第27天】强化学习(RL)在实际应用中展现出巨大潜力,但其安全性问题日益凸显。为此,安全强化学习(SRL)应运而生。近日,来自慕尼黑工业大学、同济大学和加州大学伯克利分校的研究人员在《IEEE模式分析与机器智能汇刊》上发表了一篇综述论文,系统介绍了SRL的方法、理论和应用。SRL主要面临安全性定义模糊、探索与利用平衡以及鲁棒性与可靠性等挑战。研究人员提出了基于约束、基于风险和基于监督学习等多种方法来应对这些挑战。
59 2
|
2月前
|
安全 Java 编译器
Java 泛型深入解析:类型安全与灵活性的平衡
Java 泛型通过参数化类型实现了代码重用和类型安全,提升了代码的可读性和灵活性。本文深入探讨了泛型的基本原理、常见用法及局限性,包括泛型类、方法和接口的使用,以及上界和下界通配符等高级特性。通过理解和运用这些技巧,开发者可以编写更健壮和通用的代码。
|
2月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
335 0
|
4月前
|
区块链 C# 存储
链动未来:WPF与区块链的创新融合——从智能合约到去中心化应用,全方位解析开发安全可靠DApp的最佳路径
【8月更文挑战第31天】本文以问答形式详细介绍了区块链技术的特点及其在Windows Presentation Foundation(WPF)中的集成方法。通过示例代码展示了如何选择合适的区块链平台、创建智能合约,并在WPF应用中与其交互,实现安全可靠的消息存储和检索功能。希望这能为WPF开发者提供区块链技术应用的参考与灵感。
67 0
|
4月前
|
安全 开发者 数据安全/隐私保护
Xamarin 的安全性考虑与最佳实践:从数据加密到网络防护,全面解析构建安全移动应用的六大核心技术要点与实战代码示例
【8月更文挑战第31天】Xamarin 的安全性考虑与最佳实践对于构建安全可靠的跨平台移动应用至关重要。本文探讨了 Xamarin 开发中的关键安全因素,如数据加密、网络通信安全、权限管理等,并提供了 AES 加密算法的代码示例。
67 0
|
4月前
|
存储 安全 程序员
|
24天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
64 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
72 0
|
2月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
57 0

推荐镜像

更多