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

简介:

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,如需转载请自行联系原作者

相关文章
|
8月前
|
存储 缓存 网络协议
阿里云特惠云服务器99元与199元配置与性能和适用场景解析:高性价比之选
2025年,阿里云长效特惠活动继续推出两款极具吸引力的特惠云服务器套餐:99元1年的经济型e实例2核2G云服务器和199元1年的通用算力型u1实例2核4G云服务器。这两款云服务器不仅价格亲民,而且性能稳定可靠,为入门级用户和普通企业级用户提供了理想的选择。本文将对这两款云服务器进行深度剖析,包括配置介绍、实例规格、使用场景、性能表现以及购买策略等方面,帮助用户更好地了解这两款云服务器,以供参考和选择。
|
6月前
|
域名解析 应用服务中间件 Shell
使用nps配置内网穿透加域名解析
使用nps配置内网穿透加域名解析
717 76
|
12月前
|
机器学习/深度学习 安全 大数据
揭秘!企业级大模型如何安全高效私有化部署?全面解析最佳实践,助你打造智能业务新引擎!
【10月更文挑战第24天】本文详细探讨了企业级大模型私有化部署的最佳实践,涵盖数据隐私与安全、定制化配置、部署流程、性能优化及安全措施。通过私有化部署,企业能够完全控制数据,确保敏感信息的安全,同时根据自身需求进行优化,提升计算性能和处理效率。示例代码展示了如何利用Python和TensorFlow进行文本分类任务的模型训练。
701 6
|
8月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
9月前
|
域名解析 网络协议 Ubuntu
DHCP与DNS的配置
通过这些步骤,您可以在Linux环境下成功配置和验证DHCP和DNS服务。希望这些内容对您的学习和工作有所帮助。
730 27
|
9月前
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
1000 12
|
9月前
|
存储 人工智能 并行计算
2025年阿里云弹性裸金属服务器架构解析与资源配置方案
🚀 核心特性与技术创新:提供100%物理机性能输出,支持NVIDIA A100/V100 GPU直通,无虚拟化层损耗。网络与存储优化,400万PPS吞吐量,ESSD云盘IOPS达100万,RDMA延迟<5μs。全球部署覆盖华北、华东、华南及海外节点,支持跨地域负载均衡。典型应用场景包括AI训练、科学计算等,支持分布式训练和并行计算框架。弹性裸金属服务器+OSS存储+高速网络综合部署,满足高性能计算需求。
|
11月前
|
域名解析 负载均衡 安全
DNS技术标准趋势和安全研究
本文探讨了互联网域名基础设施的结构性安全风险,由清华大学段教授团队多年研究总结。文章指出,DNS系统的安全性不仅受代码实现影响,更源于其设计、实现、运营及治理中的固有缺陷。主要风险包括协议设计缺陷(如明文传输)、生态演进隐患(如单点故障增加)和薄弱的信任关系(如威胁情报被操纵)。团队通过多项研究揭示了这些深层次问题,并呼吁构建更加可信的DNS基础设施,以保障全球互联网的安全稳定运行。
|
12月前
|
机器学习/深度学习 人工智能 安全
TPAMI:安全强化学习方法、理论与应用综述,慕工大、同济、伯克利等深度解析
【10月更文挑战第27天】强化学习(RL)在实际应用中展现出巨大潜力,但其安全性问题日益凸显。为此,安全强化学习(SRL)应运而生。近日,来自慕尼黑工业大学、同济大学和加州大学伯克利分校的研究人员在《IEEE模式分析与机器智能汇刊》上发表了一篇综述论文,系统介绍了SRL的方法、理论和应用。SRL主要面临安全性定义模糊、探索与利用平衡以及鲁棒性与可靠性等挑战。研究人员提出了基于约束、基于风险和基于监督学习等多种方法来应对这些挑战。
318 2
|
域名解析 存储 缓存
DNS是什么?内网电脑需要配置吗?
【10月更文挑战第22天】DNS是什么?内网电脑需要配置吗?
1946 1

推荐镜像

更多
  • DNS
  • 下一篇
    开通oss服务