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 :
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 makecert -sr LocalMachine -ss My -n CN=ServiceModelSamples-HTTPS-Server -sky exchange -sk ServiceModelSamples-HTTPS-Key
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.
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>
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) :
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
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")); } } } }
dans le serviceBehavior.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <serviceCredentials> <userNameAuthentication customUserNamePasswordValidatorType="MonService.WCFService.CustomUserNameValidator, MonService.WCFService" userNamePasswordValidationMode="Custom" /> </serviceCredentials>
J'ai également ajouté :
sans oublier de rajouter ceci sur mon Endpoint :
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>
Ce qui donne au total :
Code : Sélectionner tout - Visualiser dans une fenêtre à part bindingConfiguration="secureBasic"
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.
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>
J'ai alors le message d'erreur suivant :
A noter que si je ne précise pas les ClientsCredentials côté client, ça affiche ceci :Impossible d'établir une relation de confiance pour le canal sécurisé SSL/TLS avec l'autorité "le nom du serveur"
ce qui semble plutôt logique.Le nom d'utilisateur n'est pas fourni. Spécifiez un nom d'utilisateur dans ClientCrédentials.
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" :
Mais dés que je fais ça, j'ai ce message qui apparait quand je tente d'afficher le WSDL dans le navigateur internet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <security mode="Transport" > <transport clientCredentialType="Basic" /> </security>
Je vois pas trop quoi faire ??? J'ai bien choisi le type Basic.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.
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 :
J'ai bien sur essayé de l'ajouter mais sans changement. Dans quel cas faut il ajouter cette ligne ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part <serviceCertificate findValue="ServiceModelSamples" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
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 solutionMerci d'avance.
Partager