如果我将ProtectionLevel用作服务合同的属性:

  [ServiceContract(ProtectionLevel=ProtectionLevel.EncryptAndSign)]
  public interface IService
   {
    [OperationContract]
    string GetData1(long token);

    [OperationContract]
    string GetData2(long token);

    [OperationContract]
    string GetData3(long token);

   }


会应用于所有方法吗?我的意思是,我所有的方法都将被加密签名?

在每种方法上使用MessageContract属性有何区别? (与粒度无关,在这种情况下,我的目标是确保所有方法的安全)

我知道与MessageContract一起使用将具有返回[MessageContract]标记类的限制,并且也将[MessageContract]类用作参数。
我可以使用原始类型并使用接口级别的属性来加密我的方法的所有参数和返回值,从而获得相同的结果吗?

我打算使用wsHttpBinding。

最佳答案

当在接口级别设置ProtectionLevel时,它将应用于所有OperationContracts和MessageContracts。

层次结构如下。同级的属性是对等体。


ServiceContractAttribute
OperationContractAttribute
MessageContractAttribute,FaultContractAttribute
MessageHeaderAttribute,MessageBodyMemberAttribute


将ProtectionLevel设置在最顶部会设置其下面所有级别的水平。如果在较低级别将ProtectionLevel设置为其他值,则层次结构中该级别以下的所有级别现在都将重置为新级别

在每个MessageContract级别应用ProtectionLevel是为了进行粒度控制

public class Record
{
   [MessageHeader(ProtectionLevel=None)] public int recordID;
   [MessageHeader(ProtectionLevel=EncryptAndSign)] public string SSN;
   [MessageBodyMember(ProtectionLevel=None)] public string comments;
   [MessageBodyMember(ProtectionLevel=EncryptAndSign)] public string history;
}


对于邮件头,分别为每个头确定保护级别。

对于邮件正文部分,正文的保护级别由所有正文部分的最高ProtectionLevel属性设置确定。

出于以下原因,建议使用MessageContracts

使用MessageContracts的优点


对于基于SOAP的通信特别有用
控制SOAP消息的结构控制其内容。
在消息或消息部分级别控制安全问题
互操作性(例如,.net或java / client或
服务)

[MessageContract]
public class Record
{
  [MessageHeader(Name="ID")] public int personID;
  [MessageBodyMember(Order=1)] public string comments;
}



为了使安全功能正常工作,您必须在配置中或通过代码正确配置绑定和行为。

下面显示了使用wsHttpBinding的典型消息安全绑定

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBindingMessageSecurity">
      <security mode="message">
      </security>
    </binding>
  </wsHttpBinding>
</bindings>


以上内容将根据您的安全要求而更改。

没有消息合同

您可以配置WCF服务而无需消息合同。没有消息合同,实现安全性会很好。

下面是一个典型的例子

服务合同,其方法返回字符串(原始数据类型)

[ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public interface IService
{
    [OperationContract(IsOneWay = false)]
    string Register();
}


这是绑定

<wsHttpBinding>
    <binding name="wsHttpBindingConfiguration" receiveTimeout="00:10:00"  sendTimeout="10.00:00:00" maxBufferPoolSize="1073741824" maxReceivedMessageSize="1073741824">
      <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
      <security>
        <message clientCredentialType="Windows"/>
      </security>
    </binding>
  </wsHttpBinding>


这是加密的响应(为简洁起见,仅供参考)

<s:Body u:Id="_0">
<e:EncryptedData Id="_1" Type="http://www.w3.org/2001/04/xmlenc#Content" xmlns:e="http://www.w3.org/2001/04/xmlenc#">
  <e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
  <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
    <o:SecurityTokenReference xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <o:Reference ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/dk" URI="#uuid-fab89344-49bb-4b84-a7ea-02bad97b9142-6"/>
    </o:SecurityTokenReference>
  </KeyInfo>
  <e:CipherData>
    <e:CipherValue>BFlxwcK/QcXFlGUWNoE+LAOSizI1BEFKHlpDdHvby9PRwPTQFRztn+1pWmz8S0UgKzM/Puqud3N0G1tb/xcLsdNyIqgvQ68UjG+g5LGyqlbUEHa4+LaCWvW7ADN3eqoP+y1mhrN91ehIPpgYclrFHcIv/UDVCB+LLG4iMMikGqY=</e:CipherValue>
  </e:CipherData>
</e:EncryptedData>




因此,为了实现安全性,不必具有消息合同

希望这可以帮助。

关于c# - WCF保护级别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22998847/

10-17 02:44