none
Authentification WCF avec CustomUserNameValidator RRS feed

  • Question

  • 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é :

     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 :

    [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 :

      <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

    mardi 4 décembre 2012 08:45

Réponses

  • Bonjour,

    Je suis rester avec une connexion https qui c'est mise à fonctionner en modifiant le binding="basicHttpsbinding" en "basicHttpbinding"

    • Marqué comme réponse Kiwi19 vendredi 14 décembre 2012 09:48
    vendredi 14 décembre 2012 09:48

Toutes les réponses

  • 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 !!

    mardi 4 décembre 2012 11:36
  • 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 :

    <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>

    mardi 4 décembre 2012 15:37
  • Bonjour,

    Je suis rester avec une connexion https qui c'est mise à fonctionner en modifiant le binding="basicHttpsbinding" en "basicHttpbinding"

    • Marqué comme réponse Kiwi19 vendredi 14 décembre 2012 09:48
    vendredi 14 décembre 2012 09:48