comment ajouter du SAVON en-tête de Sécurité

J'ai lu beaucoup d'articles et de réponses, mais je ne pouvais pas travailler.

Je suis en utilisant .NET Framework 4.0 sur mon projet. Donc, j'ai d'abord ajouté le WebService comme un Service de Référence et d'obtenir les liaisons sur mon application.config. Et je vais vous faire une liste de mes tentatives


Tentative #1

J'ai instancié le service comme celui-ci et a ajouté les informations d'identification:

Sur L'App.Config

<binding name="SubscriptionWSImplServiceSoapBinding" >
  <security mode="TransportWithMessageCredential">
    <transport clientCredentialType="Basic"/>
  </security>
</binding>

SubscriptionWSImplServiceClient ClientWs = new SubscriptionWSImplServiceClient();
ClientWs.ClientCredentials.UserName.UserName = "some-username";
ClientWs.ClientCredentials.UserName.Password = "some-password";

var SomeResposne = ClientWs.RunMethod(); //I have exception at this point

J'obtiens une Exception comme ci-dessous:

 System.ArgumentException: The provided URI scheme 'http' is invalid;
 expected 'https'. Parameter name: via at System.ServiceModel.Channels

Les exceptions dit que le service web de l'url doit être en HTTPS mais le url du service web pour moi, c'est pas HTTP HTTPS.

Mais je n'ai pas l'esprit du HttpS et est allé pour ma 2ème tentative.


Tentative #2

Comme indiqué dans cette réponse j'ai essayé comme ci-dessous:

BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
CustomBinding customBinding = new CustomBinding(binding);
SecurityBindingElement element = customBinding.Elements.Find<SecurityBindingElement>();
element.IncludeTimestamp = false;

EndpointAddress address = new EndpointAddress("https://www.GivenServiceUrl.com/WebService"); //Note that the url does not end as ..svc or ..asmx! Just the name like this with no dot or extension


SubscriptionWSImplServiceClient ClientWs = new SubscriptionWSImplService(customBinding, address);
ClientWs.ClientCredentials.UserName.UserName = "some-username";
ClientWs.ClientCredentials.UserName.Password = "some-password";

var SomeResposne = ClientWs.RunMethod(); //I have exception at this point

J'obtiens une Exception comme ci-dessous:

Système.ServiceModel.De sécurité.SecurityNegotiationException: ne Peut pas
établir une relation de confiance pour le canal sécurisé SSL/TLS avec autorité"https://www.GivenServiceUrl.com/WebService'

Donc, je suis allé pour ma 3ème tentative qui j'ai donné la référence comme WebReference pas comme ServiceReference sur mon projet.


Tentative #3

SubscriptionWSImplService ClientWs2 = new SubscriptionWSImplService();
var SomeResposne = ClientWs.RunMethod(); //I have exception at this point

Je ne sais pas comment envoyer l'en-tête de sécurité à ce point.

J'obtiens une Exception comme ci-dessous:

 System.Web.Services.Protocols.SoapHeaderException: An error was
 discovered processing the <wsse: Security> header

Mais ici, je ne pouvais pas ajouter l'en-tête nécessaires. Pourriez-vous m'aider?


Tenter 1 ou Tenter 2 ou Tentative 3, lequel doit être utilisé considérant également que j'utilise le Framework 4.0? Et comment puis-je résoudre le problème?

Selon le document de la demande finale de SAVON doit être comme ceci:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sub="http://subscription.services.ws.fourplay.com.tr/">
   <soapenv:Header>
      <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
         <wsse:UsernameToken wsu:Id="UsernameToken-12" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:Username>admin</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">123456</wsse:Password>
           <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">1lcj+WbCMlrPyhcud4QxiQ==</wsse:Nonce>
           <wsu:Created>2012-06-05T10:23:26.879Z</wsu:Created>
        </wsse:UsernameToken>
     </wsse:Security>
   </soapenv:Header>
   <soapenv:Body>
      <sub:RunMethod>
         <!--Optional:-->
         <sub:opaque id>555555555</sub:opaque id>
         <sub:params>
            <!--Optional:-->
            <name>GUID</name>
            <!--Optional:-->
            <value>2fc4ce1d-645e-41f4-811e-28510a02a17f </value>
         </sub:params>      
</sub: RunMethod >
Vous ne serez pas en mesure de le faire avec une Référence Web. Ils ne prennent pas en charge WS-Security

OriginalL'auteur E-A | 2013-10-01