カスタム バインディングを使用して、UsernameToken で SOAP ヘッダーを渡す認証 Web サービスを使用しようとしています。
ICollection<BindingElement> bindingElements = new List<BindingElement>();
HttpsTransportBindingElement httpBindingElement = new HttpsTransportBindingElement();
CustomTextMessageBindingElement textBindingElement = new CustomTextMessageBindingElement();
SecurityBindingElement securityElement = SecurityBindingElement.CreateUserNameOverTransportBindingElement();
securityElement.IncludeTimestamp = false;
bindingElements.Add(securityElement);
bindingElements.Add(textBindingElement);
bindingElements.Add(httpBindingElement);
CustomBinding binding = new CustomBinding(bindingElements);
EndpointAddress address = new EndpointAddress("https://....");
var client = new WebServiceClient(binding, address);
client.ClientCredentials.UserName.UserName = "USERNAME HERE";
client.ClientCredentials.UserName.Password = "PASSWORD HERE";
using (new OperationContextScope(client.InnerChannel))
{
var req = new WebServiceRequest();
var resp = client.initiate(req);
}
例外を取得する:
メッセージのセキュリティ検証に失敗しました。
BinarySecretSecurityToken の ' http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd ' 名前空間を持つ 'BinarySecurityToken' 要素からトークンを読み取れません。「oblix:ObSSOCookie」ValueType。この要素が有効であると予想される場合は、指定された名前、名前空間、および値の型を持つトークンを消費するようにセキュリティが構成されていることを確認してください。"}
サーバー スタック トレース:
System.ServiceModel.Security.TransportSecurityProtocol.VerifyIncomingMessage (メッセージ & メッセージ、TimeSpan タイムアウト) で System.ServiceModel.Security.SecurityProtocol.VerifyIncomingMessage (メッセージ & メッセージ、TimeSpan タイムアウト、SecurityProtocolCorrelationState [] correlationStates) で
1.SecurityRequestChannel.ProcessReply(Message reply, SecurityProtocolCorrelationState correlationState, TimeSpan timeout) at System.ServiceModel.Channels.SecurityChannelFactory
1.System.ServiceModel.Dispatcher.RequestChannelBinder.Request(メッセージ メッセージ、TimeSpan タイムアウト) での SecurityRequestChannel.Request(メッセージ メッセージ、TimeSpan タイムアウト) System.ServiceModel.Channels.ServiceChannel.Call(文字列アクション、Boolean oneway、ProxyOperationRuntime 操作、オブジェクト[] ins、Object[] outs、TimeSpan タイムアウト) System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime 操作) で System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage メッセージ)
フィドラーがキャッチした応答は次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="oblix:ObSSOCookie" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:oblix="http://schemas.oblix.com/ws/2004/04/authentication"><!--REMOVED--></wsse:BinarySecurityToken>
</wsse:Security>
</env:Header>
<env:Body>
<MobileAppsLoginSSOProcessResponse xmlns="http://xmlns.oracle.com/MobileAppsLoginSSO">
<ReturnStatus>SUCCESS</ReturnStatus>
</MobileAppsLoginSSOProcessResponse>
</env:Body>
</env:Envelope>
http://msdn.microsoft.com/en-us/library/ms751486%28v=vs.100%29.aspxに従って CustomTextMessageEncoder を使用しています
編集:
Yaron が示唆しているように、応答から BinarySecurityToken タグを取り除かない限り、コードは上記の Message Security Validation Failed 例外で失敗します。
応答の「oblix:ObSSOCookie」は、認証が成功したときにサービスからクライアントに返される認証 Cookie であり、クライアントはこの Cookie を保存する必要があると思います。
解決策:
最終編集で Yaron が提案したようにSecurityElementBinding
、カスタム バインディングから削除し、カスタム メッセージ インスペクター ( IClientMessageInspector
) を使用してヘッダーにセキュリティ タグを挿入しました。
AfterReceiveReply
これにより、SOAP 本文からのみ応答を解釈できるようになり、IClientMessageInspector
実装の SOAP 応答ヘッダーを読み取ることができます。