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

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

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

相关文章
|
10天前
|
机器学习/深度学习 安全 大数据
揭秘!企业级大模型如何安全高效私有化部署?全面解析最佳实践,助你打造智能业务新引擎!
【10月更文挑战第24天】本文详细探讨了企业级大模型私有化部署的最佳实践,涵盖数据隐私与安全、定制化配置、部署流程、性能优化及安全措施。通过私有化部署,企业能够完全控制数据,确保敏感信息的安全,同时根据自身需求进行优化,提升计算性能和处理效率。示例代码展示了如何利用Python和TensorFlow进行文本分类任务的模型训练。
38 6
|
6天前
|
机器学习/深度学习 人工智能 安全
TPAMI:安全强化学习方法、理论与应用综述,慕工大、同济、伯克利等深度解析
【10月更文挑战第27天】强化学习(RL)在实际应用中展现出巨大潜力,但其安全性问题日益凸显。为此,安全强化学习(SRL)应运而生。近日,来自慕尼黑工业大学、同济大学和加州大学伯克利分校的研究人员在《IEEE模式分析与机器智能汇刊》上发表了一篇综述论文,系统介绍了SRL的方法、理论和应用。SRL主要面临安全性定义模糊、探索与利用平衡以及鲁棒性与可靠性等挑战。研究人员提出了基于约束、基于风险和基于监督学习等多种方法来应对这些挑战。
15 2
|
12天前
|
域名解析 存储 缓存
DNS是什么?内网电脑需要配置吗?
【10月更文挑战第22天】DNS是什么?内网电脑需要配置吗?
45 1
|
25天前
|
机器学习/深度学习 调度
mmseg配置解析 Polynomial Decay 多项式衰减
Polynomial Decay(多项式衰减)是一种常用的学习率调度方法,通过多项式函数逐步减少学习率,帮助模型更好地收敛。公式为:\[ lr = (lr_{initial} - \eta_{min}) \times \left(1 - \frac{current\_iter}{max\_iters}\right)^{power} + \eta_{min} \]。参数包括初始学习率、最小学习率、当前迭代次数、总迭代次数和衰减指数。适用于需要平滑降低学习率的场景,特别在训练后期微调模型参数。
48 0
mmseg配置解析 Polynomial Decay 多项式衰减
|
27天前
|
网络协议 Docker 容器
docker中的DNS配置
【10月更文挑战第5天】
213 1
|
1月前
|
弹性计算 网络协议 Ubuntu
如何在阿里云国际版Linux云服务器中自定义配置DNS
如何在阿里云国际版Linux云服务器中自定义配置DNS
|
1月前
|
安全 Java 编译器
Java 泛型深入解析:类型安全与灵活性的平衡
Java 泛型通过参数化类型实现了代码重用和类型安全,提升了代码的可读性和灵活性。本文深入探讨了泛型的基本原理、常见用法及局限性,包括泛型类、方法和接口的使用,以及上界和下界通配符等高级特性。通过理解和运用这些技巧,开发者可以编写更健壮和通用的代码。
|
21天前
|
JSON JavaScript 前端开发
深入解析ESLint配置:从入门到精通的全方位指南,精细调优你的代码质量保障工具
深入解析ESLint配置:从入门到精通的全方位指南,精细调优你的代码质量保障工具
61 0
|
25天前
|
编解码 计算机视觉
mmseg配置解析 align_corners=False
`align_corners=False` 是图像插值操作中的一个参数,影响输入和输出图像的角点对齐方式。`align_corners=True` 严格对齐角点,而 `align_corners=False` 均匀分布像素点,更适用于保持整体比例关系的任务,如语义分割。
28 0
|
25天前
|
机器学习/深度学习 编解码
mmseg配置解析 contract_dilation=True
`contract_dilation=True` 是 ResNetV1c 中的一种设置,用于解决多层膨胀卷积中的“栅格效应”。通过调整膨胀率,使卷积核在不同阶段更密集地覆盖输入特征图,避免信息丢失,提升特征提取质量,尤其在语义分割任务中效果显著。
36 0

热门文章

最新文章

推荐镜像

更多