IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Discussion :

impossible de fournir un mot de passe dans l entete


Sujet :

Services Web

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Par défaut impossible de fournir un mot de passe dans l entete


    Je n arrive pas a passer en parametre a un web service un nom d utilisateur et un mot de passe.
    J ai regarde pas mal d exemples mais rien a faire, le programme n envoie pas dans l entete le nom et le mot de passe

    J ai généré avec VS le code de la clase qui permet l acces au web service et normalement j ai juste à l appeler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    ConsoleApplication1.SapData.GetDataService getDataService = new ConsoleApplication1.SapData.GetDataService();
     
    // set the credention for the web service
    System.Net.NetworkCredential crd = new System.Net.NetworkCredential("usr", "passwd");
     
    //ne marche pas avec ou sans CredentialCache
                System.Net.CredentialCache credCache = new System.Net.CredentialCache();
    //credCache.Add(new Uri("http://17.29.29.32"), "Basic",crd);
    //credCache.Add(new Uri("http://frel0021.tutu.fr"), "Basic", crd);
    //credCache.Add(new Uri("http://17.29.29.32:50100/irj/servlet/prt/soap/com.sap.portal.prt.soap.GetData"), "Basic", crd);
     
    getDataService.Credentials = crd;
     
    getDataService.UseDefaultCredentials = false;
    getDataService.PreAuthenticate = true;
     
    //create the web service request 
    string request = "Administrator";//request the details about admin account
     
    //call the web service
    string valueFromWebService = getDataService.getUserDetails(request);
    //et j ai ici une exception car aucun mot de passe a été fournit !
    La classe générée par VS est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.3053")]
        [System.Diagnostics.DebuggerStepThroughAttribute()]
        [System.ComponentModel.DesignerCategoryAttribute("code")]
        [System.Web.Services.WebServiceBindingAttribute(Name="com.sap.portal.prt.soap.GetDataBinding", Namespace="prt:service:com.conti.tma.webservice.GetData")]
        public partial class GetDataService : System.Web.Services.Protocols.SoapHttpClientProtocol {
    Wireshark me permet de lire ce qui est envoyé. J ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    POST /irj/servlet/prt/soap/com.sap.portal.prt.soap.GetData?style=doc_lit HTTP/1.1
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3082)
    Content-Type: text/xml; charset=utf-8
    SOAPAction: "prt:service:com.conti.tma.webservice.GetData.GetData/getUserDetails0"
    Host: 17.29.29.32:50100
    Content-Length: 377
    Expect: 100-continue
    Connection: Keep-Alive
    Il manque bien Authorization: Basic QWRt….

    Quelqu un a t il une idée pourquoi ca ne marche pas ? ou un exemple d acces a un service web avec un mot de passe qui fonctionne ?

    merci !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Par défaut info supplementaire
    je viens de faire un essai avec un autre web service qui lui marche avec un code similaire.

    Apparemment, on envoie d abord un entete SANS mot de passe. Puis is on recoit une erreur 401 (Unauthorized) on renvoie un entete AVEC login/password

    Dans le cas du web service KO, on a pas une erreur 401 mais 500 (internal error)
    Donc pas de 2eme envoi

    Question:
    Y a t il quelqu un qui sait comment forcer l envoi du login/password dès la premiere demande de connection au web service ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Par défaut
    Es-tu sur que l'erreur ne vient pas du service web, plutot ?

    Erreur 500 = Exception levée coté serveur

    Cordialement,
    Kevin D.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Par défaut web service OK
    le web service fonctionne
    c est vrai qu il devrait envoyer 401 (authentification KO) au lieu de 500 (internal error) mais si j envoie login/password dans l entete, il marche tres bien (j ai essaye avec soap ui)

    en plus le web service n a pas ete developpe par nous, donc ca va etre dur de le faire changer

    donc la solution la plus simple, c est que le code .net envoie la premiere fois le login/password et n attend pas une erreur 401 pour le faire

    mais merci pour la reponse

  5. #5
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2
    Par défaut
    Pour résoudre ce problème, j'ai trouvé sur un site web qu'il fallait faire une sous classe qui hérite de la classe proxy du web service et qui redéfinit la méthode GetWebRequest() :

    Sous classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
     
    namespace tonpackage
    {
        //On crée une classe héritant de la classe proxy du web service Produit
        //Par conséquent, elle possède le même comportement
        public class ProduitSC : tonpackage.WSProduit.Produit
        {
            //on redéfinit la méthode GetWebRequest
            protected override System.Net.WebRequest GetWebRequest(Uri uri)
            {
                HttpWebRequest request;
                request = (HttpWebRequest)base.GetWebRequest(uri);
     
                //Si une authentification est envoyée
                if (PreAuthenticate)
                {
                    NetworkCredential networkCredentials =
                    Credentials.GetCredential(uri, "Basic");
     
                    if (networkCredentials != null)
                    {
                        byte[] credentialBuffer = new UTF8Encoding().GetBytes(
                          networkCredentials.UserName + ":" +
                          networkCredentials.Password);
                        //on rajoute le header pour que le web service puisse nous identifier
                        request.Headers["Authorization"] =
                          "Basic " + Convert.ToBase64String(credentialBuffer);
                    }
                    else
                    {
                        throw new ApplicationException("No network credentials");
                    }
                }
                return request;
            }
        }
    }

    Utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WSProduit.Produit Produit = new tonpackage.ProduitSC();
    au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WSProduit.Produit Produit = new tonpackage.Produit();

Discussions similaires

  1. Changer le mot de passe dans VB
    Par Safaritn dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/10/2005, 12h19
  2. Passage de login mot de passe dans l'URL avec IE6 sp2
    Par SPA dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 07/10/2005, 08h47
  3. Smbclient mettre le mot de passe dans la ligne de commande
    Par EpOnYmE187 dans le forum Réseau
    Réponses: 2
    Dernier message: 28/07/2005, 19h39
  4. apache su mot de passe dans un fichier
    Par jean-jacques varvenne dans le forum Apache
    Réponses: 4
    Dernier message: 31/01/2005, 20h07
  5. sécuriser le mot de passe dans une page asp
    Par Redouane dans le forum ASP
    Réponses: 2
    Dernier message: 10/03/2004, 21h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo