У меня есть библиотека классов (Target Framework: .Net Standard 2.0), которая вызывает веб-сервис с WS Security.
Если я вызываю сервис в SoapUI с UserToken, он работает.
Вот конверт SOAP:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:v1="http://appServer/mobileid/service/v1">
<soap:Header><wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><wsse:UsernameToken wsu:Id="UsernameToken-B2070E5FD2D0CF2BD1153780123646881"><wsse:Username>test-service-user</wsse:Username><wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">testUserPassword</wsse:Password><wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">isaadasdasUlheZsnsuMbnolV==</wsse:Nonce><wsu:Created>2018-09-24T15:34:24.686Z</wsu:Created></wsse:UsernameToken></wsse:Security></soap:Header>
<soap:Body>
<v1:checkNumber>
<phoneNumber>+41712223366</phoneNumber>
<language>de</language>
</v1:checkNumber>
</soap:Body>
</soap:Envelope>
А вот тестовый код, который я нашел здесь в качестве решения, но он выдает исключение:
var endPointAddr = new EndpointAddress(serviceUrl);
var binding = new BasicHttpBinding
{
Security =
{
Mode = BasicHttpSecurityMode.TransportWithMessageCredential,
Transport =
{
ClientCredentialType = HttpClientCredentialType.None
}
}
};
this._service = new NumberCheckWSClient(binding, endPointAddr);
this._service.ClientCredentials.UserName.UserName = UserName;
this._service.ClientCredentials.UserName.Password = Password;
using (new OperationContextScope(this._service.InnerChannel))
{
var usernameTokenHeader = MessageHeader.CreateHeader("UsernameToken", NameSpace, UserName);
OperationContext.Current.OutgoingMessageHeaders.Add(usernameTokenHeader);
var passwordTextHeader = MessageHeader.CreateHeader("PasswordText", NameSpace, Password);
OperationContext.Current.OutgoingMessageHeaders.Add(passwordTextHeader);
return this._service.checkNumber(PhoneNumber, languageCode.de);
}
Исключением является "Значение «TransportWithMessageCredential» не поддерживается в этом контексте для свойства безопасности привязки «Mode». "
Вопрос в том,Если он не поддерживается в .Net Standard 2.0, есть ли обходной путь для вызова службы с аутентификацией WS?
РЕДАКТИРОВАТЬ:
После попытки найти некоторые решения, я нашелна следующей странице, которая дала мне представление о проблеме.Однако это решение не поддерживается .Net Standard 2.0.
https://weblog.west -wind.com / posts / 2012 / Nov / 24 / WCF-WSSecurity-and-WSE-Nonce-Authentication
Если я использую это решение с .Net Framework 4.6.1, я получу следующее исключение, даже сгенерированный запрос SOAP точно такой же с SoapUI.
System.ServiceModel.FaultException: InternalОшибка
Server stack trace:
bei System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
bei System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
bei System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
bei System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
bei System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
bei System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)