Если на моей конечной точке службы возникла общая ошибка, реакция на ошибку нежелательно и неожиданно зашифрована.
Я создал конечную точку с настраиваемой привязкой по соображениям совместимости с инфраструктурой Java Spring, настроенной на безопасность транспорта с подписью только над мылом 1.1.
<service behaviorConfiguration="MyProject.WebServices.MyServiceBehavior"
name="MyProject.WebServices.Protected">
<endpoint address="" binding="customBinding" bindingConfiguration="mySoap11"
contract="MyProject.WebServices.IMyService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
<behavior name="MyProject.WebServices.MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<clientCertificate>
<authentication revocationMode="NoCheck" trustedStoreLocation="LocalMachine"
certificateValidationMode="PeerOrChainTrust"/>
</clientCertificate>
<serviceCertificate findValue="aa bb cc dd ee ..."
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindByThumbprint"/>
</serviceCredentials>
</behavior>
<customBinding>
<binding name="mySoap11">
<textMessageEncoding messageVersion="Soap11" />
<security allowSerializedSigningTokenOnReply="true" authenticationMode="MutualCertificate"
requireDerivedKeys="false" securityHeaderLayout="Lax" includeTimestamp="false"
messageProtectionOrder="EncryptBeforeSign" messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"
requireSecurityContextCancellation="false" requireSignatureConfirmation="false">
<localClientSettings detectReplays="false" />
<localServiceSettings detectReplays="false" />
<secureConversationBootstrap />
</security>
<httpTransport>
<extendedProtectionPolicy policyEnforcement="Never" />
</httpTransport>
</binding>
</customBinding>
Существует два договора о неисправности, которые оформляют договоры на эксплуатацию.Первый для общих ошибок, а второй использует контракт проверки валидации корпоративной библиотеки.Атрибут контракта на обслуживание и операции, связанные с двумя ошибками, оформляются как
[ValidationBehavior()]
[ServiceContract(Namespace = "http://namespace", ProtectionLevel=ProtectionLevel.Sign)]
public interface IMyService
{
[OperationContract]
[FaultContract(typeof(ValidationFault), Namespace = "http://namespace", ProtectionLevel = ProtectionLevel.Sign)]
[FaultContract(typeof(MyFaultContract), Namespace = "http://namespace", ProtectionLevel = ProtectionLevel.Sign)]
MyTypeOfContractResponse Method(MyTypeOfContractRequest request);
}
//The message response contract
[MessageContract(IsWrapped = false)]
public class MyTypeOfContractResponse
{
[MessageBodyMember]
public bool Success { get; set; }
}
//The message request contract
[MessageContract(IsWrapped = true, ProtectionLevel=ProtectionLevel.Sign)]
[HasSelfValidation]
public class MyTypeOfContractRequest
{
[MessageBodyMember(Order = 0)]
public bool MyValue { get; set; }
[SelfValidation]
public void DoValidate(ValidationResults results)
{
...
}
}
и т. Д. *
Если сделан хороший запрос, тело ответа обычно читается со знаком и не зашифровано.Если возникает ошибка проверки или выдается исключение из контракта ошибки WCF, то ответ снова является действительным, читаемым и имеет только подпись.
<s:Body u:Id="_1">
<Success xmlns="http://namespace">true</Success>
</s:Body>
Если, однако, общая ошибка возникла в форме выброса нового исключения();или возникла ошибка;скажем, был изменен порядок членов тела сообщения контрактов сообщения;тогда тело ответа зашифровано, например
<s:Body u:Id="_2">
<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"></e:EncryptionMethod>
<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 URI="#_0"></o:Reference>
</o:SecurityTokenReference>
</KeyInfo>
<e:CipherData>
<e:CipherValue>+7Zs7rMkF...</e:CipherValue>
</e:CipherData>
</e:EncryptedData>
</s:Body>
Как бы вы могли предотвратить шифрование необработанных ответов?