一、契约的保护等级为绑定进行消息保护设置了“最低标准”
定义在契约上消息保护级别实际上为WCF实施消息保护设置了一个“最低标准
”。由于整个消息保护机制,不论是签名还是加密,都是在信道层
实现的。而信道层最终是通过绑定来实现的,绑定的属性决定了信道层处理消息的能力。而绑定安全方面的属性自然就决定了最终的信道层是否有能力对消息实施签名和加密。一方面,以契约形式定义的消息保护级别帮助信道层决定应该对传入的消息采取那个级别的保护机制
;另一方面,如果绑定所能提供的消息保护能力不能达到这个最低标准,就会抛出异常
。
举个例子,如果我们通过如下的代码将服务契约ICalculator的Add操作的保护级别设置成EncryptAndSign。
1: [ServiceContract(Namespace = "http://www.artech.com/")]
2: public interface ICalculator
3: {
4: [OperationContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
5: double Add(double x, double y);
6: }
但是我们确将终结点使用到的WS2007HttpBinding的安全模式设置成None。那么在对服务进行寄宿的时候,就会跑出如下图所示的InvalidOperationException
异常,提示“必须保护请求消息”。
1: <system.serviceModel>
2: <bindings>
3: <ws2007HttpBinding>
4: <binding name="bindingWithNoneSecurityMode">
5: <security mode="None"/>
6: </binding>
7: </ws2007HttpBinding>
8: </bindings>
9: <services>
10: <service name="Artech.WcfServices.Services.CalculatorService" >
11: <endpoint address="http://127.0.0.1/calculatorservice" binding="ws2007HttpBinding" bindingConfiguration="bindingWithNoneSecurityMode"
12: contract="Artech.WcfServices.Contracts.ICalculator"/>
13: </service>
14: </services>
15: </system.serviceModel>
二、显式地将保护等级设置成ProtectionLevel.None与没有设置保护等级有区别吗?
在这里有一个很多人会忽视的要点。表示消息保护级别的ProtectionLevel类型是一个枚举,所以它肯定有一个默认值。这个默认值就是
None,也就是说当你没有显式地指定契约具有采用那么保护级别的时候,默认值就是None。但是这种情况和你显式保护级别设置为None的效果是完全不
一致的。因为前者真正采用的保护级别(当绑定安全被开启)实际上是EncryptAndSign,后者才是None。那么WCF如何来区分这两种情况呢?
如果你足够细心,你应该会发现:在上面介绍的定义消息保护级别的特性中,除了具有一个可读可写的ProtectionLevel属性之外,还具有一个只读的HasProtectionLevel
属性,该属性表示你是否对消息保护级别进行了“显式”的设置。我们可以通过一个简单的实验来演示HasProtectionLevel的作用。
下面我定义了两个服务契约IServiceContract1和IServiceContract2,其实前者没有对ProtectionLevel进行相应的设置,后者被显式地设置为None。
1: [ServiceContract]
2: public interface IServiceContract1
3: {
4: [OperationContract]
5: void DoSomething();
6: }
7: [ServiceContract(ProtectionLevel = ProtectionLevel.None)]
8: public interface IServiceContract2
9: {
10: [OperationContract]
11: void DoSomething();
12: }
然后我编写了如下的代码,基于上面两个接口类型生成相应的ContractDescription对象,然后将它们的
ProtectionLevel和HasProtectionLevel属性输出来。从最终的输出结果我们可以很清楚地看到:两种情况下下
ProtectionLevel属性值都是None,但是只有当你显式地设置了ProtectionLevel的情况
下,HasProtectionLevel属性才会返回True。WCF就是根据ContractDescription的这两个属性决定最终采用怎样的
消息保护级别的。android代码实现ScaleAnimation
1: ContractDescription contract1 = ContractDescription.GetContract(typeof(IServiceContract1));
2: ContractDescription contract2 = ContractDescription.GetContract(typeof(IServiceContract2));
3:
4: Console.WriteLine("{0,-10}{1,-20}{2,-20}", "Contract","ProtectionLevel", "HasProtectionLevel");
5:
6: Console.WriteLine("{0,-10}{1,-20}{2,-20}", "contract1", contract1.ProtectionLevel, contract1.HasProtectionLevel);
7: Console.WriteLine("{0,-10}{1,-20}{2,-20}", "contract2", contract2.ProtectionLevel, contract2.HasProtectionLevel);
输出结果:
1: Contract ProtectionLevel HasProtectionLevel
2: contract1 None False
3: contract2 None True
三、消息的保护等级与WS-Addressing
关于消息保护级别与绑定的关系,还有一点需要着重强调。虽然我们可以对于同一个服务契约下操作设置不同的保护级别,但是在WSDL中需要基于WS-Addressing中的寻址(Addressing)机制来识别基于操作的保护级别。在使用的绑定不支持WS-Addressing的情况下(比如BasicHttpBinding),它会选择所有操作中等级最高的那个作为所有操作的保护级别
。比如说对于如下定义的服务契约ICalculator,在使用BasicHttpBinding的情况下,两个操作采用的保护级别都是EncryptAndSign
。
1: [ServiceContract]
2: public interface ICalculator
3: {
4: [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
5: double Add(double x, double y);
6: [OperationContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
7: double Substract(double x, double y);
8: }
这实际上会为你的应用带来一个很隐晦的问题,为了将这个问题阐述得更加清楚,我通过一个例子来说明。还是应用我们的计算服务的例子,下面是我们再熟悉不过的服务契约的定义,Add操作的保护级别被设置成Sign
。
1: [ServiceContract(Namespace = "http://www.artech.com/")]
2: public interface ICalculator
3: {
4: [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
5: double Add(double x, double y);
6: }
但是这个服务契约并被客户端共享,而客户端服务契约中定义了一个额外的操作Substract,该操作的保护级别并未作显式设置。iPhone如何设置和使用VPN
1: [ServiceContract(Namespace = "http://www.artech.com/")]
2: public interface ICalculator
3: {
4: [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
5: double Add(double x, double y);
6: [OperationContract]
7: double Substract(double x, double y);
8: }
现在选择BasicHttpBinding作为终结点的绑定,并将安全模式甚至成Message。当你客户端调用Add操作的时候。会抛出如下图所示的MessageSecurityException
异常,提示“主签名必须加密”。但是当你将客户端Substract删除或者将Substract操作的消息保护级别也设置成Sign是,这个异常将不会出现
。
出现这样的异常的原因在于:对于不支持WS-Addressing的BasicHttpBinding来说,会选择所有操作中等级最高的那个最为所
有操作的保护级别。对于客户端来说,由于Substract没有对保护级别进行显式设置,默认采用最高等级的EncryptAndSign。但是服务端的
等级确是Sign。
在这种情况下,请求消息会同时被加密和签名。请求消息被服务端接受之后,虽然它对应的等级是Sign,但是依然能够处理该请求。这就是所谓的“消息
保护级别的最低标准”原则,定义在契约中的保护级别只是确立了一个消息保护的“底线”。你不能低于这个最低标准,但是可以高于它。但是服务执行正常的运算
后,只会按照定义在本地契约中设置的保护级别对回复消息进行签名。客户端接受到这个仅仅被签名的回复消息,会发现等级不够,所以才会提示你“主签名必须加
密”。
分享到:
相关推荐
文档中提到的“物理环境安全等级保护要求”部分,按照不同等级(文中提及了五个等级,但未具体阐述每个等级的内容)提出了对公众电信网和互联网物理环境的安全要求。这五个等级很可能代表着不同程度的安全威胁,以及...
在分析《省级应急广播系统网络安全等级保护技术体系设计.pdf》这篇文献时,可以提炼出以下重要的知识点: 1. 网络安全等级保护设计: - 省级应急广播系统需遵循第三级网络安全等级保护的要求,意味着该系统在设计...
在应用安全方面,需要对基本应用如消息发送、Web浏览以及业务应用如电子商务、电子政务等进行安全保护。部署文档安全管理系统(DSM)、数据库审计系统(UMA-DB)和防病毒网关(AVE)等产品可以帮助识别和防御应用程序层面...
涉及资源:1《信息安全等级保护商用密码技术要求》使用指南 2.2009年03月 《信息安全等级保护 商用密码技术实施要求》 3 2015年09月 《信息安全等级保护商用密码测评机构审批服务指南》4.GM_T 0054-2018 《信息系统...
根据提供的文件信息,我们可以提炼出以下关于信息系统安全等级保护测评报告的相关知识点。尽管给出的【部分内容】较为混乱,且明显为OCR扫描识别错误,但尝试从混乱的数字和字符序列中,我们可以尽可能提取出有用...
《电信网和互联网安全防护体系的定级对象划分及建议安全等级》报告主要涉及的是网络安全保护的分级体系,这是确保电信网和互联网稳定运行的重要环节。该报告详细列出了各类网络、系统及其子系统的安全等级建议,以...
UIPI的工作原理相当简单直观:它检查发送方和接收方的MIC等级,并基于这些等级决定是否允许消息传递。具体而言: - 对于用户自定义的消息ID(即大于`WM_USER`的消息),如果发送方的MIC等级低于接收方,则消息会被...
1. **SSM(Synchronization Status Message,同步状态消息)**:用于在SDH网络中传递时钟质量信息,帮助节点识别和选择最佳同步源。SSM包含在ITU-T建议G.8131中定义的时钟质量等级,提供了对时钟源质量的评估。 2. ...
进程间通信(IPC)也是重要的概念,包括管道、信号量、消息队列和共享内存等机制。深入理解这些内容能帮助考生分析和解决实际问题。 内存管理则关注如何有效地分配和回收内存,包括分页、分段和虚拟内存等技术。...
为了保护用户隐私,敏感信息应进行加密处理。 2. **在线用户表**: 在线用户表记录当前活跃用户的ID和最后活动时间,便于系统追踪用户在线状态,实现即时聊天功能。此表可以定期更新,清理长时间未活动的用户。 3...
安全保护等级划分准则 信息安全技术 信息系统安全等级保护定级指南 信息安全技术网络安全等级保护基本要求 信息安全技术网络安全等级保护安全设计技术要求 2、企业级网络安全与等保2.0 00 课程简介 01 网络安全概述...
特别注意,需将基于SSM(Synchronous Status Message,同步状态消息)时钟保护的网元纳入时钟保护子网,否则SSM不会被激活,可能导致时钟跟踪倒换错误。 #### 三、故障定位与排除 **3.1 故障定位方法** - **检查...
8. **消息广播与接收**:广播机制允许角色间通信,接收到特定消息的脚本会执行相应操作。 9. **绘图工具**:在绘制图形时,可以利用复制功能快速生成相似的图形,如奥运五环的绘制。 10. **对象层次**:调整对象的...
同时,记得设置合理的隐私保护,避免不必要的信息安全风险。 3. **获得附近的人认可**:积极参与“附近的人”功能,通过发布动态、点赞、打招呼等方式与其他用户互动。一个吸引人的个人简介和照片能帮助你获得更多...
理解类是对象的蓝图,对象是类的实例,封装可以保护数据不被随意访问,继承允许子类继承父类的属性和行为,多态则允许不同的对象对同一消息做出不同的响应。 三、模板和泛型编程 C++的模板是实现泛型编程的主要工具...
它能灵活适应各种安全场景,通过实时监测和快速反应,保障变电站系统的安全运行,提升整体安全等级。微机继电保护不仅能够有效识别和处理系统内的异常情况,还能防止恶意攻击,增强系统的抗风险能力。 在网络安全...
五、安全性和隐私保护 1. **加密通信**:采用SSL/TLS等加密技术,保证通信内容的安全性。 2. **身份验证**:玩家登录时进行身份验证,防止非法用户冒充发送消息。 3. **权限管理**:根据用户角色和权限设置消息发送...