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 >
OriginalL'auteur E-A | 2013-10-01
Vous devez vous connecter pour publier un commentaire.
Je l'ai résolu en utilisant WCF, sans informations d'identification déclaré. Je l'ai fait par la construction de mon en-tête personnalisé, j'ai obtenu de l'aide de ce lien
et à l'utilisation de l'en-tête je l'ai eu à partir de ce lien.
Ne pas utiliser la fonction "Ajouter une Référence Web". C'est l'héritage "ASMX" de la technologie, qui ne doit pas être utilisé pour un nouveau développement.
Votre _createdDate.ToString(...) utilise une chaîne de format non valide qui génère une date comme "AAAA-10-DDT06:10:59"... au Lieu d'utiliser _createdDate.ToString("o")
OriginalL'auteur E-A
J'ai eu le même problème que la Première Tentative de la question et que je devais avoir une sortie de même que la question. La réponse est parfaitement bien, mais Juste pour améliorer la réponse ci-dessus ou, devrais-je dire de combiner la réponse avec le lien j'ai fait le la suite.
OriginalL'auteur Waqas ali