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 :

Authentification WCF avec CustomUserNameValidator [Débutant]


Sujet :

Services Web

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 Authentification WCF avec CustomUserNameValidator
    Bonjour,

    Je travail en ce moment sur la conception de web services en WCF et je bloque sur l'authentification.

    Après avoir lu beaucoup d'article, je me suis lancé pour commencer doucement dans la méthode présenté par la MSDN dans ce Lien, qui est de créer une classe CustomUserNameValidator pour travailler sur la méthode validate().

    Seulement, et je pense que la plupart des problèmes que je rencontre viennent de là, j'ai des difficultés à comprendre les différences entre les différentes liaisons utilisés.

    Dans tous les articles que j'ai lu, la configuration du web config et toujours différentes et je n'arrive pas très bien à me repérer. Enfin voilà, tous ça pour dire que malgré la bonne implémentation de ma classe CustomUserNameValidator et de ma méthode validate(), dans mon application cliente lorsque je m'identifie comme ceci :
    ws = new ServiceReference.Service1Client("BasicHttpBinding_IService1");
    ws.ClientCredentials.UserName.UserName = "admin";
    ws.ClientCredentials.UserName.Password = "admin";
    ws.Open();
    Je ne passe tout de même pas dans ma méthode validate() et lorsque j'essaie de vérifier au début d'une méthode de mon web service si la personne est bien identifié j'ai comme problème que mon PrimaryIdentity à toujours des valeurs vide ou égale à false.

    Voici le code utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public string VerificationImg(byte[] img)
    {
                if (!OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.IsAuthenticated)
                {
                    throw new SecurityException();
                }
    ...
    }
    Et lorsque j'ai essayé de passe par les attribues, j'ai eu le message d'erreur suivant :
    Échec de la demande d'autorisation principale.
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    [PrincipalPermission(SecurityAction.Demand, Name = "yyy")]
    public string VerificationImg(byte[] img)
    {
    }
    J'ai cru comprendre également que pour utiliser ce type d'authentification il est necessaire de passer par une connexion SSL seulement je travail en local et tous mes test dans mon fichier de configuration c'est avérer un échec !

    Voici la section serviceModel de mon web.config :
    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
     
    <system.serviceModel>
        <bindings>
          <wsHttpBinding>
            <binding name="test2">
                <security mode="TransportWithMessageCredential">
                <message clientCredentialType="UserName"/>
                </security>
            </binding>
          </wsHttpBinding>
          <basicHttpsBinding>
              <binding name="test">
                <security mode="TransportWithMessageCredential">
                  <transport clientCredentialType="Basic" />
                  <message clientCredentialType="UserName"/>
                </security>
              </binding>
          </basicHttpsBinding>
        </bindings>
        <behaviors>
          <serviceBehaviors>
            <behavior>
              <!-- 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="false" />
              <serviceCredentials useIdentityConfiguration="true">
                  <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="CustomUserNameValidator, MyService" />
              </serviceCredentials>
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <protocolMapping>
            <add binding="basicHttpsBinding" scheme="https" bindingConfiguration="test" />
        </protocolMapping>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
      </system.serviceModel>
    Si vous pouviez m'aider à finaliser et à comprendre cette partie afin que les clients utilisant du web service puissent s'identifier. Merci d'avance

  2. #2
    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
    Bon, j'ai un petit peu avancé en réussissant à activer une connexion SSL à mon webservice sur IIS seulement le problème reste toujours le même !

    Je ne passe jamais par ma fonction validate() de ma classe CustomUserNameValidator et lorsque je procède au test d'authentification j'ai exactement les mêmes erreurs que décrit juste au dessus. Mon OperationContext.Current est toujours vide !!

  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
    Bon, ne trouvant pas de solution, j'ai essayer de changer de liaisons et d'utiliser le mode wshttpbinding.

    Et maintenant, j'ai le message d'erreur suivant qui s'affiche :
    Au moins un jeton de sécurité du message n'a pas pu être validé.
    Je ne comprend pas du tout ce message car je suis toujours censé passé par ma methode validate qui n'est jamais appelé !
    J'ai l'utilitaire SOAPUI si cela peut aider à résoudre le problème, seulement je ne sais pas m'en servir, alors si vous avez peut être quelques indications qui me permettrai d'avancer je suis preneuse...

    Pour info voici mon nouveau fichier .config :
    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="Service1" behaviorConfiguration="myconfigBehavior">
            <endpoint address="" binding="wsHttpBinding" contract="IService1" bindingConfiguration="wsbasichttp"></endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
          </service>
        </services>
     
        <behaviors>
          <serviceBehaviors>
            <behavior name="myconfigBehavior">
              <!-- 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 useIdentityConfiguration="true">
                <serviceCertificate storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectName" findValue="localhost"/>
                <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="CustomUserNameValidator, Service" />
              </serviceCredentials>
            </behavior>
          </serviceBehaviors>
        </behaviors>
     
        <bindings>
          <wsHttpBinding>
            <binding name="wsbasichttp">
                <security mode="TransportWithMessageCredential">
                  <message clientCredentialType="UserName"/>
                </security>
            </binding>
          </wsHttpBinding>
          <basicHttpBinding>
            <binding name="basicHttp">
              <security mode="TransportWithMessageCredential">
                <transport clientCredentialType="Basic" proxyCredentialType="Basic" />
                <message clientCredentialType="UserName"/>
              </security>
            </binding>
          </basicHttpBinding>
        </bindings>
     
        <protocolMapping>
            <add binding="wsHttpBinding" scheme="https" bindingConfiguration="wsbasichttp" />
            <add binding="wsHttpBinding" scheme="http" bindingConfiguration="wsbasichttp" />
        </protocolMapping>
     
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false" />
      </system.serviceModel>

  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
    Je suis rester en connexion https en modifiant cette ligne comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <add binding="basicHttpBinding" scheme="https" bindingConfiguration="basichttp" />

  5. #5
    Candidat au Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Par défaut
    Si tu veux rester en Http, tu peux coté client passer surcharger la validation de ton certificat, en utilisant un CertificateValidator custom.

    Définition du behavior du endpoint, il faut ajouter dans le endpoint : behaviorConfiguration = "myClientBehavior"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     <behaviors>
          <endpointBehaviors>
            <behavior name="myClientBehavior">
              <clientCredentials>
                <serviceCertificate>
                  <authentication certificateValidationMode="Custom" customCertificateValidatorType="NameSpace.MyX509Validator,NameAssembly" />
                </serviceCertificate>
              </clientCredentials>
            </behavior>
          </endpointBehaviors>
        </behaviors>
    Ensuite le validator doit implémenter : X509CertificateValidator
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        public class MyX509Validator : X509CertificateValidator
        {
            public override void Validate(X509Certificate2 certificate)
            {
                // validate argument
                if (certificate == null)
                    throw new ArgumentNullException("certificate");
     
                // check if the name of the certifcate matches
                if (certificate.SubjectName.Name != "CN=MyServerCert")
                    throw new SecurityTokenValidationException("Certificated was not issued by thrusted issuer");
            }
        }
    Cela permettra de valider ton certifcat, côté client.
    Tu pourras alors communiqué en http mais avec les messages cryptés.

    Et utilise le binding wsHttpBinding :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      <wsHttpBinding>
                  <binding name="WSHttpBinding_IPacitelService">
                      <security>
                          <message clientCredentialType="UserName" />
                      </security>
                  </binding>
              </wsHttpBinding>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/02/2014, 16h46
  2. Réponses: 3
    Dernier message: 29/09/2009, 17h27
  3. Réponses: 3
    Dernier message: 14/03/2006, 11h38
  4. Réponses: 1
    Dernier message: 14/10/2005, 22h14

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