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

Windows Communication Foundation .NET Discussion :

Utilisation de UserNamePasswordValidator


Sujet :

Windows Communication Foundation .NET

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Utilisation de UserNamePasswordValidator
    Bonjour à tous,

    J'essaye de mettre en place un Service WCF hébergé via IIS7 sur un serveur. Histoire de faire les choses petit à petit, j'ai d'abord commencé par créer un simple service qui renvoie une chaine de caractère ("Bonjour"). Ce service était exposé via un seul endpoint en basicHttpBinding. Cette première étape fonctionne parfaitement.

    J'ai compliqué un peu les choses en testant d'exposer une méthode qui va chercher des données dans une BDD. Là aussi, pas de problème.

    L'étape suivant a consisté à utiliser https au lieu de http. Pour cela, j'ai créé un certificat sur la machine serveur avec cette ligne de commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    makecert -sr LocalMachine -ss My -n CN=ServiceModelSamples-HTTPS-Server -sky exchange -sk ServiceModelSamples-HTTPS-Key
    Sur IIS, j'ai rajouté la liaison https (sur le port 443) en spécifiant bien ce certificat. J'ai également mis les bonnes exceptions sur le firewall de la machine. A ce stade, mon fichier Web.Config ressemblait à ça :

    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
     
    <?xml version="1.0"?>
     
    <configuration>
     
      <system.web>
        <customErrors mode="Off"/>
      </system.web>
     
      <connectionStrings>
        <add name="MesEntities" connectionString="ma chaine de connexion à la bdd" />
      </connectionStrings>
     
      <system.serviceModel>
        <services>
          <service name="MonService.WCFService.MonServiceWCF" behaviorConfiguration="MetadataWSDL">
            <host>
              <baseAddresses>
                <add baseAddress="https://localhost"/>
              </baseAddresses>
            </host>
            <endpoint address=""
                      binding="basicHttpBinding"
                      contract="MonService.ServiceContract.IMonServiceWCF" />
          </service>
        </services>
     
        <behaviors>
          <serviceBehaviors>
            <behavior name="MetadataWSDL">
              <serviceMetadata httpsGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="true" />
              <dataContractSerializer maxItemsInObjectGraph="6553600"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
     
      </system.serviceModel>
     
    </configuration>
    Là encore, tout fonctionne parfaitement. Désormais, quand je met à jour la Référence du Service sur mon projet WPF (ou Silverlight), j'ai une fenetre "Security Alert" qui m'affiche le Certificat et me demande si je veux poursuivre.

    La dernière étape consiste maintenant à mettre en place un système d'authentification en utilisant UserNamePasswordValidator.

    J'ai donc commencé par créé une nouvelle classe sur mon service (dans le projet WCFService) :

    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
     
    namespace MonService.WCFService
    {
        public class CustomUserNameValidator : UserNamePasswordValidator
        {
            public override void Validate(string userName, string password)
            {
                if (userName == null || password == null)
                {
                    throw new ArgumentNullException();
                }
                if (userName != "login" && password != "pass")
                {
                    throw new FaultException<Exception>(new Exception("Utilisateur inconnu"));
                }
            }
        }
    }
    J'ai ensuite modifié le fichier Web.Config du projet Web. J'ai ajouté ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <serviceCredentials>
                <userNameAuthentication customUserNamePasswordValidatorType="MonService.WCFService.CustomUserNameValidator, MonService.WCFService" userNamePasswordValidationMode="Custom" />
              </serviceCredentials>
    dans le serviceBehavior.

    J'ai également ajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <bindings>
          <basicHttpBinding>
            <binding name="secureBasic" >
              <security mode="TransportWithMessageCredential" >
                <transport clientCredentialType="Basic" />
              </security>
            </binding>
          </basicHttpBinding>
        </bindings>
    sans oublier de rajouter ceci sur mon Endpoint :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bindingConfiguration="secureBasic"
    Ce qui donne au total :

    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
    51
    52
    53
    54
     
    <?xml version="1.0"?>
     
    <configuration>
     
      <system.web>
        <customErrors mode="Off"/>
      </system.web>
     
      <connectionStrings>
        <add name="MesEntities" connectionString="ma chaine de connexion" />
      </connectionStrings>
     
      <system.serviceModel>
        <services>
          <service name="MonService.WCFService.MonServiceWCF" behaviorConfiguration="MetadataWSDL">
            <host>
              <baseAddresses>
                <add baseAddress="https://localhost"/>
              </baseAddresses>
            </host>
            <endpoint address=""
                      binding="basicHttpBinding"
                      contract="MonService.ServiceContract.IMonServiceWCF"
                      bindingConfiguration="secureBasic" />
          </service>
        </services>
     
        <bindings>
          <basicHttpBinding>
            <binding name="secureBasic" >
              <security mode="TransportWithMessageCredential" >
                <transport clientCredentialType="Basic" />
              </security>
            </binding>
          </basicHttpBinding>
        </bindings>
     
        <behaviors>
          <serviceBehaviors>
            <behavior name="MetadataWSDL">
              <serviceCredentials>
                <userNameAuthentication customUserNamePasswordValidatorType="MonService.WCFService.CustomUserNameValidator, MonService.WCFService" userNamePasswordValidationMode="Custom" />
              </serviceCredentials>
              <serviceMetadata httpsGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="true" />
              <dataContractSerializer maxItemsInObjectGraph="6553600"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
     
      </system.serviceModel>
     
    </configuration>
    A ce stade, j'arrive bien à afficher mon fichier WSDL. Je met à jour la Référence de mon Service et je tente d'appeler une des méthodes sur service.

    J'ai alors le message d'erreur suivant :

    Impossible d'établir une relation de confiance pour le canal sécurisé SSL/TLS avec l'autorité "le nom du serveur"
    A noter que si je ne précise pas les ClientsCredentials côté client, ça affiche ceci :

    Le nom d'utilisateur n'est pas fourni. Spécifiez un nom d'utilisateur dans ClientCrédentials.
    ce qui semble plutôt logique.

    Quelqu'un a déjà eu ce message ? J'ai fais quelques recherches sur le net sans succés. Doit pas manquer grand chose (p-e juste un problème de configuration côté serveur).

    J'ai bien entendu tenter de faire des modifications en changeant par exemple le mode de Securité du binding en "Transport" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <security mode="Transport" >
                <transport clientCredentialType="Basic" />
              </security>
    Mais dés que je fais ça, j'ai ce message qui apparait quand je tente d'afficher le WSDL dans le navigateur internet :

    Erreur du serveur dans l'application '/'.
    --------------------------------------------------------------------------

    Les paramètres de sécurité pour ce service requièrent l’authentification « Basic », mais elle n’est pas activée pour l’application IIS qui héberge ce service.
    Je vois pas trop quoi faire ??? J'ai bien choisi le type Basic.

    Enfin, dernière question, j'ai lu dans plusieurs exemples vu sur Internet que certains développeurs indiquaient ceci dans le ServiceCredential du Web.Config :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <serviceCertificate findValue="ServiceModelSamples" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
    J'ai bien sur essayé de l'ajouter mais sans changement. Dans quel cas faut il ajouter cette ligne ?

    Voilà, j'espère que quelqu'un pourra m'apporter un élément de réponse. J'ai l'impression de pas être loin de la solution Merci d'avance.
    Dernière modification par Deepin ; 01/02/2010 à 15h52. Motif: Balises [QUOTE]...[/QUOTE] au lieu de [CODE]...[/CODE]

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/08/2010, 17h04
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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