.Net Standard 2.0 Nonce Authentication - вызов веб-службы с помощью WS Security - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть библиотека классов (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)
...