サービス エンドポイントで一般的な障害が発生した場合、障害の応答が望ましくなく、予期せず暗号化されます。
SOAP 1.1 を介した署名のみのトランスポート セキュリティで設定された Java Spring フレームワークとの相互運用性の理由から、カスタム バインディングを使用してエンドポイントを作成しました。
<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>
操作コントラクトを装飾する 2 つのフォルト コントラクトがあります。1 つ目は一般的なエラーの場合で、2 つ目はエンタープライズ ライブラリの検証エラー コントラクトを使用する場合です。サービス コントラクト属性と操作コントラクトの 2 つの障害は、次のように装飾されます。
[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>
ただし、一般的な障害の場合は、throw new Exception(); の形式でスローされます。またはエラーが発生します。メッセージ コントラクト メッセージ本文メンバーの順序が変更されたとします。次に、応答本文は次のように暗号化されます
<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>
未処理の応答が暗号化されないようにするにはどうすればよいでしょうか?