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 :

WSDualHttpBinding et configuration Password Digest


Sujet :

Services Web

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Par défaut WSDualHttpBinding et configuration Password Digest
    Bonjour,

    J'aimerai pouvoir configurer mon web service qui utilise la liaison WSDualHttpBinding avec la méthode d'authentification Username/password de sorte que le password passé dans les entêtes de message SOAP soit haché avec la méthode PasswordDigest décrite sur le jouranldunet.

    Voici ce l'exemple cité dans la page :
    <wsse:UsernameToken>
    <wsse:Username>scott</wsse:Username>
    <wsseassword Type="wsseasswordDigest">
    KE6QugOpkPyT3Eo0SEgT30W4Keg=</wsseassword>
    <wsse:Nonce>5uW4ABku/m6/S5rnE+L7vg==</wsse:Nonce>
    <wsu:Created xmlns:wsu=
    "http://schemas.xmlsoap.org/ws/2002/07/utility">
    2002-08-19T00:44:02Z
    </wsu:Created>
    </wsse:UsernameToken>
    Seulement mes entêtes sont générés automatiquement via le frameword .Net avec WCF et je ne trouve pas où est ce que je peux configurer ceci dans le fichier de configuration.

    Voici mon fichier de configuration actuel :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    <system.serviceModel>
      <services>
        <service name="WS.ServiceProduits" behaviorConfiguration="behaviorConfig">
          <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="wsDualHttp" contract="WS.Interface.IProduits">
            <identity>
              <dns value="localhost"/>
            </identity>
          </endpoint>
          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
      </services>
      <bindings>
        <wsDualHttpBinding>
          <binding name="wsDualHttp" maxReceivedMessageSize="10485760">
            <readerQuotas maxArrayLength="10485760"/>
            <security mode="Message">
              <message clientCredentialType="UserName"/>
            </security>
          </binding>
        </wsDualHttpBinding>
      </bindings>
      <behaviors>
        <serviceBehaviors>
          <behavior name="behaviorConfig">
            <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
            <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
            <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
            <serviceDebug includeExceptionDetailInFaults="true" />
            <serviceCredentials>
              <clientCertificate>
                <authentication certificateValidationMode="None" revocationMode="NoCheck" />
              </clientCertificate>
              <serviceCertificate storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectName" findValue="localhost" />
              <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WS.CustomUserNameValidator, WS" />
            </serviceCredentials>
            <serviceAuthorization principalPermissionMode="Custom">
              <authorizationPolicies>
                <add policyType="WS.CustomAuthorizationPolicy, WS" />
              </authorizationPolicies>
            </serviceAuthorization>
          </behavior>
        </serviceBehaviors>
      </behaviors>
      <protocolMapping>
        <add binding="wsDualHttpBinding" scheme="https" bindingConfiguration="wsDualHttp" />
        <add binding="wsDualHttpBinding" scheme="http" bindingConfiguration="wsDualHttp" />
      </protocolMapping>
      <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    </system.serviceModel>
    Si vous pouvez m'aider se serait vraiment top

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Apparemment ça n'est pas supporté nativement par WCF, et il faut mettre en place une extension pour gérer ça.

    Voici deux liens qui t'aideront :
    - PasswordDigest authentication in WCF
    - UsernameToken Profile vs. WCF
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Par défaut
    Ah ! Et même coté client, il n'y a pas moyen d'ajouter une propriété dans le fichier de configuration ?

    Citation Envoyé par DotNetMatt Voir le message
    il faut mettre en place une extension pour gérer ça.
    Où trouver des exemples ?! J'ai pu constater que dans le logiciel SOAP UI, en modifiant une propriété, elle applique directement dans le header la methode PasswordDigest !

    Sinon, j'ai déjà vu ces liens mais vu qu'ils utilisent une classe coté web service, cela implique que le password doit dans un premier temps transiter en clair sur le réseau avant d'atteindre cette classe ! non ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Par défaut
    J'ai trouvé ceci sur la MSDN : http://msdn.microsoft.com/en-us/library/ms731172.aspx

    Ce lien indique que la méthode password digest n'est pas possible avec le mode "TransportWithMessageCredential" mais wsDualHttpBinding utilise uniquement le mode "message".
    Voici la citation trouvé dans la page web :
    UserName
    Allows the service to require that the client be authenticated using a user name credential. Note that when the security mode is set to TransportWithMessageCredential, WCF does not support sending a password digest or deriving keys using password and using such keys for Message mode security. As such, WCF enforces that the transport is secured when using user name credentials.

  5. #5
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Dans le premier lien tu as un exemple codé de A à Z.

    la méthode password digest n'est pas possible avec le mode "TransportWithMessageCredential" mais wsDualHttpBinding utilise uniquement le mode "message".
    Tu utilises le mode TransportWithMessageCredential ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Par défaut
    Non justement, ce mode n'existe pas avec la configuration WSDualHttpBinding.
    J'ai trouver un autre article qui détail un peu plus le processus :
    http://blog.benpowell.co.uk/2010/11/...-password.html

    Néanmoins celui ci indique que WCF a volontaire choisi de ne pas implémenter l'option passwordDigest, alors qu'est ce qui est utilisé à la place ?
    Cela veut donc dire que l'on est obligé de laisser passer les mots de passes en clair sur le réseau si on n'utilise le framework WCF tel qu'il est ?!

  7. #7
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Nanais19 Voir le message
    Néanmoins celui ci indique que WCF a volontaire choisi de ne pas implémenter l'option passwordDigest, alors qu'est ce qui est utilisé à la place ?
    Tu as, à priori, deux solutions alternatives :
    - Implémenter ton propre "PasswordDigest", à l'aide des exemples de codes donnés sur le dernier lien que tu as cité, ou sur mon premier lien.
    - Regarder du côté de Windows Identity Foundation (WIF), et en particulier le concept de SecurityTokenHandler.

    Citation Envoyé par Nanais19 Voir le message
    Cela veut donc dire que l'on est obligé de laisser passer les mots de passes en clair sur le réseau si on n'utilise le framework WCF tel qu'il est ?!
    Oui... Difficile de dire quelle est la stratégie suivie par Microsoft à ce sujet.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Par défaut
    Ok, bon bé avant de me lancer dans la modification des entêtes SOAP, j'aimerai bien comprendre comment fonctionne cette liaison "WSDualHttpBinding".

    J'ai essayé d'utiliser SOAP UI pour tracer les messages de mon web service et rien à faire, je n'y arrive pas et ne comprend pas très bien comment la transmission des messages sont effectués entre le server et le clien et inversement.

    J'ai bien compris qu'un proxy est généré automatiquement par WCF et qu'il utilise un Port particulier et qu'il y avait des intermediaires entre le server et le client. Cependant je n'arrive pas à savoir comment connaitre le port utilisé par le proxy (qui par défaut est normalement 80 mais comment distingué si c'est 8090 ou 8080 ou autre..)

    Quels sont ces intermédiaires par lesquels passe les messages SOAP ?

    J'ai bien compris aussi qu'il y avait tous un système de jeton de sécurité qui dans mon cas semble généré à partir du mot de passe utilisateur mais j'aimerai bien pouvoir intercepter des messages pour pouvoir observer ce procéder mais je ne sais pas trop comment m'y prendre non plus !

    Ca fait beaucoup de questions... mais j'ai lu tellement de choses que j'ai du mal à m'y retrouver à force !

  9. #9
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Nanais19 Voir le message
    Ok, bon bé avant de me lancer dans la modification des entêtes SOAP, j'aimerai bien comprendre comment fonctionne cette liaison "WSDualHttpBinding".
    WSDualHttpBinding ça permet de gérer une communication bidirectionnelle (on envoie un message, et on écoute le callback), via Internet (en HTTP) ou via un un réseau local (en TCP). Ca s'appelle aussi du full duplex.

    Par nature, seuls les bindings TCP ou IPC permettent une communication bidirectionnelle nativement. Afin de pouvoir le faire sur du HTTP, le WSDualHttpBinding crée deux channels de communication : un pour les appels du client vers le service, et un pour les appels du service vers le client.

    Citation Envoyé par Nanais19 Voir le message
    J'ai essayé d'utiliser SOAP UI pour tracer les messages de mon web service et rien à faire, je n'y arrive pas et ne comprend pas très bien comment la transmission des messages sont effectués entre le server et le clien et inversement.
    Je ne connais pas SOAP UI, en général j'utilise Fiddler, ou encore WireShark, qui permettent de capturer ce qui passe sur le réseau. En gros, la communication se déroule comme ceci :

    Côté client, on crée un Endpoint. Côté serveur, on a également un Endpoint. Entre les deux, on va établir un Channel (un canal de communication), qui va nous servir à faire transiter le message entre les endpoints du client et du serveur.

    Si on est en bidirectionnel, on aura alors un second Channel qui sera chargé de faire remonter la réponse (le Callback) depuis le serveur, vers le client, toujours via ces mêmes endpoints.

    Citation Envoyé par Nanais19 Voir le message
    J'ai bien compris qu'un proxy est généré automatiquement par WCF et qu'il utilise un Port particulier et qu'il y avait des intermediaires entre le server et le client. Cependant je n'arrive pas à savoir comment connaitre le port utilisé par le proxy (qui par défaut est normalement 80 mais comment distingué si c'est 8090 ou 8080 ou autre..)
    Effectivement WCF génère automatiquement une sorte de proxy, le ClientBaseAddress, si tu n'en as pas spécifié explicitement. Par défaut, le port utilisé sera le port 80 pour le channel dédié au callback (du serveur vers le client).

    Pour définir ton propre port, il te suffit de définir un ClientBaseAddress, dans le fichier de configuration. Voici un exemple :
    Code XML : 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
    <system.serviceModel>
        <client>
            <endpoint
                address  = "http://localhost:24555/Service"
                contract = "IContract"
                binding  = "wsDualHttpBinding"
                bindingConfiguration = "ClientCallback"
            />
        </client>
        <bindings>
            <wsDualHttpBinding>
                <binding
                    name = "ClientCallback"
                    clientBaseAddress = "http://localhost:24556/"
                />
            </wsDualHttpBinding>
        </bindings>
    </system.serviceModel>

    Citation Envoyé par Nanais19 Voir le message
    J'ai bien compris aussi qu'il y avait tous un système de jeton de sécurité qui dans mon cas semble généré à partir du mot de passe utilisateur mais j'aimerai bien pouvoir intercepter des messages pour pouvoir observer ce procéder mais je ne sais pas trop comment m'y prendre non plus !
    Tu peux trouver beaucoup d'info sur le sujet sur le net... Voici deux liens :
    - Token based Authentication for WCF HTTP/REST Services
    - Implementing a Secure token service with WCF
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Par défaut
    Merci beaucoup pour toutes ces réponses qui me sont très utiles à la compréhension du fonctionnement de WCF.

    Seulement, je ne connais pas cette propriété clientbaseadress. J'ai donc fait quelque recherche seulement j'aimerai être sûre d'avoir bien compris.

    Je peux laisser mon fichier de config coté serveur tel qu'il est, de sorte à ce qu'il utilise par défaut le port 80 :
    <service name="WS.ServiceProduits" behaviorConfiguration="behaviorConfig">
    <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="wsDualHttp" contract="WS.Interface.IProduits">
    <identity>
    <dns value="CertProduits"/>
    </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
    Vous pourrez remarquer que j'ai modifié entre temps la valeur du dns qui référence un certificat que j'ai généré est stocké sur mon serveur.

    Et dans le fichier de configuration coté client, je doit alors lui indiqué quel port le service devra utilisé pour communiquer avec mon client ? Comme ceci :
    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
     
               <wsDualHttpBinding>
                    <binding name="WSDualHttpBinding_Config" clientBaseAddress="http://IPClient:8085/">
                        <security>
                            <message clientCredentialType="UserName" />
                        </security>
                    </binding>
                </wsDualHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://IPServer/My_WS/ServiceProduits.svc" behaviorConfiguration="myClientBehavior"
                    binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_Config"
                    contract="ServiceReference1.Produits" name="WSDualHttpBinding_Produits">
                    <identity>
                        <dns value="CertProduits" />
                    </identity>
                </endpoint>
          <behaviors>
            <endpointBehaviors>
              <behavior name="myClientBehavior">
                <clientCredentials>
                  <serviceCertificate>
                    <authentication certificateValidationMode="None" revocationMode="NoCheck"/>
                  </serviceCertificate>
                </clientCredentials>
              </behavior>
            </endpointBehaviors>
          </behaviors>
    Puis je devrais configurer mon firewall pour qu'il laisse passer les messages entrant sous le port 8085 indiqué ci dessus c'est sa ?

  11. #11
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Nanais19 Voir le message
    Puis je devrais configurer mon firewall pour qu'il laisse passer les messages entrant sous le port 8085 indiqué ci dessus c'est sa ?
    Oui Chaque client peut ainsi définir le port sur lequel il souhaite communiquer avec le serveur.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/01/2008, 15h47
  2. configurer sql pour envoyer des mails
    Par arwen dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 29/07/2003, 15h28
  3. [configuration] lancer plusieurs serveurs Tomcat
    Par polo54 dans le forum JBuilder
    Réponses: 4
    Dernier message: 13/06/2003, 15h52
  4. Configurer OpenGL/Glut avec C++Bluider
    Par MiGoN dans le forum OpenGL
    Réponses: 2
    Dernier message: 13/09/2002, 23h18
  5. BDE : Configurer automatiquement le NETDIR
    Par Harry dans le forum Paradox
    Réponses: 10
    Dernier message: 29/07/2002, 11h33

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