Welcome to MSDN Blogs Sign in | Join | Help

Jean-Sébastien Dupuy

Distributed Services & Co.
Windows Communication Foundation Hands-On Lab : Sécurité (Partie 2)

Exercice 2 : Exemple de Sécurité mode Message et authentification par Certificats

Objectifs:

Dans cet exercice, vous devez sécuriser le service TradingService en utilisant une sécurité de type Message et une authentification par Certificats. Vous devez également contrôler les autorisations d’accès à l’aide de l’attribut PrincipalPermission.

Points Clefs:

Prenez le temps de comprendre l’attribut [PrincipalPermission], les options de sécurité associé à la liaison wsHttpBinding, et la gestion des certificats par le Client et le Service.

Etape 1. Créez dans un premier temps les certificats.

1. A partir du menu Démarrer de Windows, sélectionnez Tous les programmes.

2. Sélectionnez ensuite la rubrique Microsoft Windows SDK v6.1, puis exécutez l’application CMD Shell.

3. Exécutez la commande cd c:\wcf pour vous positionner dans le répertoire c:\wcf.

4. Utilisez les quatre commandes suivantes pour créer les certificats qui seront utilisés par le client et le service.

Création du certificat client.

 

makecert.exe -r -pe -sky exchange -n "CN=MyClientCert" MyClientCert.cer -sv MyClientCert.pvk

 

Un mot de passe vous est proposé, appuyez sur le bouton Aucun.

 

pvk2pfx -pvk MyClientCert.pvk -spc MyClientCert.cer -pfx MyClientCert.pfx

 

 

Création du certificat serveur.

 

makecert.exe -r -pe -sky exchange -n "CN=MyServerCert" MyServerCert.cer -sv MyServerCert.pvk

 

Un mot de passe vous est proposé, appuyez sur le bouton Aucun.

 

pvk2pfx -pvk MyServerCert.pvk -spc MyServerCert.cer -pfx MyServerCert.pfx

 

Les fichiers .cer et .pvk renferment respectivement les clés publiques et privés de vos certificats. Le fichier .pfx est un format d’échange (Personal inFormation eXchange) qui renferme les deux.

5. Assurez-vous que les six fichiers sont bien présents dans le répertoire c:\wcf.

Etape 2. Importez les fichiers MyClientCert.pfx et MyServerCert.pfx dans le répertoire Personnel des certificats de la machine locale.

1. A partir du menu Démarrer de Windows, sélectionnez Exécuter…

2. Exécutez la commande mmc.exe pour lancer la Console de Management Microsoft.

3. A partir du menu Fichier, sélectionnez Ajouter/Supprimer un composant logiciel enfichable…

4. Sélectionnez ensuite le composant logiciel Certificats et appuyez sur le bouton Ajouter comme précisé dans l’image 2.1.

clip_image002Image 2.1 – Ajout du composant Certificats.

5. Sélectionnez l’option Le compte de l’ordinateur comme précisé ci-dessous. Appuyez sur suivant pour poursuivre.

clip_image004

6. L’option L’ordinateur local doit être sélectionnée par défaut. Appuyez ensuite sur Terminer.

clip_image006

7. Appuyez sur le bouton OK pour accéder à la console d’administration des Certificats de votre machine locale.

clip_image008

8. Développez l’arborescence sur la gauche, puis sélectionnez le répertoire Personnel.

clip_image010

9. Affichez le menu contextuel associé au répertoire Personnel  à l’aide du bouton droit de la souris. Sélectionnez la rubrique Toutes les tâches, puis Importer… ; un assistant d’Importation doit faire son apparition.

clip_image012

10. Appuyez sur le bouton Suivant.

clip_image014

11. Appuyez sur le bouton Parcourir… et positionnez-vous dans le répertoire c:\wcf si ce n’est pas le cas.  

Important : Pour visualiser les fichiers avec le format .pfx, modifiez le filtre en bas en droite. Echange d’informations personnelles (*.pfx, *.p12) doit être sélectionné. Ne sélectionnez pas les fichiers .cer dans cette étape.

12. Sélectionnez MyClientCert.pfx et appuyez sur le bouton Ouvrir.

13. Appuyez sur Suivant pour toutes les étapes supplémentaires de l’assistant, puis Terminer.

14. Reprenez toutes les étapes à partir du point 9 pour importer également MyServerCert.pfx.

Le répertoire Personnel doit maintenant contenir deux Certificats : MyClientCert et MyServerCert.

Etape 3. Importez les fichiers MyClientCert.cer et MyServerCert.cer dans le répertoire Personnes autorisées des certificats de la machine locale.

Utiliser les mêmes étapes que précédemment pour ajouter les fichiers MyClientCert.cer et MyServerCert.cer dans le répertoire Personnes autorisées.

Le répertoire Personnes autorisées doit maintenant contenir deux Certificats : MyClientCert et MyServerCert.

Information :

Dans le cadre d’une application distribuée sur plusieurs machines, la distribution des certificats s’effectue de la manière suivante.

Sur le Serveur :

+  Import de MyServerCert.pfx dans le répertoire Personnel.

+ Import de MyClientCert.cer dans le répertoire Personnes autorisées.

Sur le client :

+ Import de MyClientCert.pfx dans le répertoire Personnel.

            + Import de MyServerCert.cer dans le répertoire Personnes autorisées.

Etape 4. Ouvrez le projet TradingService que vous avez développé précédemment dans l’exercice 1.

Etape 5. Configuration de la sécurité par Message et utilisation de l’authentification par Certificats.

1. La liaison wsHttpBinding est sécurisée par défaut avec le mode Message et une authentification Windows. Nous souhaitons utiliser maintenant une sécurité par Certificats. Modifiez le fichier App.config du projet TradingHost comme indiqué dans le fichier de configuration suivant.

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <system.serviceModel>

    <behaviors>

      <serviceBehaviors>

        <behavior name="TradingServiceBehavior">

          <serviceMetadata httpGetEnabled="true" />

        </behavior>

      </serviceBehaviors>

    </behaviors>

    <bindings>

      <wsHttpBinding>

        <binding name="SecurityMessage">

          <security mode="Message">

            <message clientCredentialType="Certificate" />

          </security>

        </binding>

      </wsHttpBinding>

    </bindings>

    <services>

      <service behaviorConfiguration="TradingServiceBehavior" name="TradingService.TradingService">

        <endpoint address="http"

                  binding="wsHttpBinding"

                  bindingConfiguration="SecurityMessage"

                  contract="TradingService.ITradingService" />

        <endpoint address="mex"

                  binding="mexHttpBinding"

                  bindingConfiguration=""

                  contract="IMetadataExchange" />

        <host>

          <baseAddresses>

            <add baseAddress="http://localhost:8000/TradingService" />

          </baseAddresses>

        </host>

      </service>

    </services>

  </system.serviceModel>

</configuration>

2. Dans ce même fichier de configuration, ajoutez les informations relatives au certificat serveur (MyServerCert)

L’élément serviceCertificate permet de préciser au Service le certificat qu’il doit utiliser. L’élément certificateValidationMode concerne la validation des certificats qui seront présentés par les clients. Avec l’utilisation de PeerTrust, le certificat est validé s'il se trouve dans le magasin Personnes autorisées. En production, il est nécessaire de créer un certificat signé par une autorité de certification et d’utiliser un mode de validation ChainTrust. Dans ce dernier cas, le certificat est validé uniquement si celui-ci a été émis à partir d’une autorité de certification présente dans le magasin Autorité de certification racines de confiance.

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <system.serviceModel>

    <behaviors>

      <serviceBehaviors>

        <behavior name="TradingServiceBehavior">

          <serviceMetadata httpGetEnabled="true" />

          <serviceCredentials>

            <serviceCertificate findValue="MyServerCert" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>

            <clientCertificate>

              <authentication certificateValidationMode="PeerTrust"/>

            </clientCertificate>

          </serviceCredentials>

        </behavior>

      </serviceBehaviors>

    </behaviors>

    <bindings>

      <wsHttpBinding>

        <binding name="SecurityMessage">

          <security mode="Message">

            <message clientCredentialType="Certificate" />

          </security>

        </binding>

      </wsHttpBinding>

    </bindings>

    <services>

      <service behaviorConfiguration="TradingServiceBehavior" name="TradingService.TradingService">

        <endpoint address="http"

                  binding="wsHttpBinding"

                  bindingConfiguration="SecurityMessage"

                  contract="TradingService.ITradingService" />

        <endpoint address="mex"

                  binding="mexHttpBinding"

                  bindingConfiguration=""

                  contract="IMetadataExchange" />

        <host>

          <baseAddresses>

            <add baseAddress="http://localhost:8000/TradingService" />

          </baseAddresses>

        </host>

      </service>

    </services>

  </system.serviceModel>

</configuration>

3. Ouvrez le fichier TradingService.cs du projet TradingHost. Supprimez les attributs PrincipalPermission placés dans l’exercice précédent pour contrôler l’accès aux méthodes InitTransactions et AjoutTransaction.

4. Ajoutez ensuite la ligne suivante dans la méthode InitTransactions.

public string InitTransactions()

{

  Console.WriteLine("Identité de l'appelant: {0}", ServiceSecurityContext.Current.PrimaryIdentity.Name);

  dealIdentifier = Guid.NewGuid().ToString();

  Console.WriteLine("Initialisation des transactions. Identifiant: {0}", dealIdentifier);

  Console.WriteLine("SessionId : {0}", OperationContext.Current.SessionId);

  return dealIdentifier;

}

ServiceSecurityContext.Current.PrimaryIdentity.Name permet d’afficher le nom de l’identité cliente utilisée pour appeler le service.

Etape 6. Compilez le projet (Ctrl+Shift+B) pour vérifier qu’aucune erreur n’a été commise précédemment. Corrigez les éventuels problèmes.

Etape 7. Via le menu contextuel du projet TradingHost, définissez celui-ci comme projet de démarrage. Le projet TradingHost doit apparaitre maintenant en gras dans l’IDE de Visual Studio.NET.

Etape 8. Démarrez le projet (Ctrl+F5) pour affichez l’application console en dehors du débuggeur.

Etape 9. A l’aide du bouton droit de la souris, ouvrez le menu contextuel de la section ServiceReference dans le projet TradingClient. Sélectionnez l’option permettant de mettre à jour la référence de votre service WCF. Les fichiers Reference.cs et app.config seront mis à jours avec les informations de la nouvelle configuration du service TradingService.

clip_image002[6]

Etape 10. Ouvrez le fichier Program.cs du projet TradingClient

Modifiez l’identité cliente utilisés par le proxy pour lui permettre d’utiliser le certificat client (MyClientCert). Ce certificat sera alors utilisé pour contacter le service TradingService. Il est également nécessaire de préciser le mode de validation associé au certificat qui sera présenté par le Service. On utilise une nouvelle fois PeerTrust.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using TradingClient.ServiceReference;

using System.Threading;

using System.Security.Cryptography.X509Certificates;

 

namespace TradingClient

{

    class Program

    {

        static void Main(string[] args)

        {

            using (ServiceReference.TradingServiceClient proxy = new ServiceReference.TradingServiceClient())

            {

                proxy.ClientCredentials.ClientCertificate.SetCertificate(

                              StoreLocation.LocalMachine,

                              StoreName.My,

                              X509FindType.FindBySubjectName,

                              "MyClientCert");

                proxy.ClientCredentials.ServiceCertificate.Authentication
                              .CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerTrust;

 

                Console.WriteLine("Pressez une touche lorsque le service est disponible.");

                Console.ReadKey();

 

                proxy.InitTransactions();

 

                Transaction trade = new Transaction();

                trade.Nombre = 10;

                trade.Symbole = "MSFT";

 

                proxy.AjoutTransaction(trade);

                proxy.AjoutTransaction(trade);

 

                decimal dealValue = proxy.Addition();

                Console.WriteLine(string.Format("Estimation de l'ensemble des transactions à ${0}", dealValue));

               

                proxy.Validation();

                proxy.FinTransactions();

 

                proxy.Close();

 

                Console.WriteLine();

                Console.WriteLine("Done.");

                Console.ReadKey();

            }  

        }

    }

}

Etape 11. Compilez le projet (Ctrl+Shift+B) pour vérifier qu’aucune erreur n’a été commise précédemment. Corrigez les éventuels problèmes.

Etape 12. Via le menu contextuel du projet TradingClient, définissez celui-ci comme projet de démarrage. Le projet TradingClient doit apparaitre maintenant en gras dans l’IDE de Visual Studio.NET.

Etape 13. Démarrez le projet (F5) pour affichez l’application console. Le Client et le Service doivent fonctionner correctement.

clip_image004[6]

L’identité de l’appelant est présentée sous la forme d’un nom qui comprend le Sujet du certificat et son empreinte (thumbprint).

Exemple: CN=MyClientCert; 783A3EB9F2674B038B8FD6974FF0C01BFBBB4EF5

Copiez l’identité de l’appelant dans la console du service. Vous allez en avoir besoin dans les dernières étapes.

Etape 14. Stoppez les instances du Client et du Service.

Etape 15. Comme expliqué dans l’exercice 1, vous pouvez utiliser l’attribut PrincipalPermission pour contrôler l’accès aux méthodes. Il en va de même pour les certificats.

Dans le fichier TradingService.cs :

[PrincipalPermission(SecurityAction.Demand, Name = @"CN=MyClientCert; 783A3EB9F2674B038B8FD6974FF0C01BFBBB4EF5")]

public string InitTransactions()

{

   Console.WriteLine("Identité de l'appelant: {0}", ServiceSecurityContext.Current.PrimaryIdentity.Name);

   dealIdentifier = Guid.NewGuid().ToString();

   Console.WriteLine("Initialisation des transactions. Identifiant: {0}", dealIdentifier);

   Console.WriteLine("SessionId : {0}", OperationContext.Current.SessionId);

   return dealIdentifier;

}

Il est juste nécessaire de rajouter préalablement l’élément serviceAuthorization avec la propriété principalPermissionMode="UseAspNetRoles" pour prendre en compte ce type d’autorisation.

Dans le fichier App.config de TradingService.cs :

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <system.serviceModel>

    <behaviors>

      <serviceBehaviors>

        <behavior name="TradingServiceBehavior">

          <serviceMetadata httpGetEnabled="true" />

          <serviceAuthorization principalPermissionMode="UseAspNetRoles" />

          <serviceCredentials>

            <serviceCertificate findValue="MyServerCert" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>

            <clientCertificate>

              <authentication certificateValidationMode="PeerTrust"/>

            </clientCertificate>

          </serviceCredentials>

        </behavior>

      </serviceBehaviors>

    </behaviors>

    <bindings>

      <wsHttpBinding>

        <binding name="SecurityMessage">

          <security mode="Message">

            <message clientCredentialType="Certificate" />

          </security>

        </binding>

      </wsHttpBinding>

    </bindings>

    <services>

 

      […]

 

    </services>

  </system.serviceModel>

</configuration>

Etape 16. Recompilez et Testez la solution.

Windows Communication Foundation Hands-On Lab : Sécurité (Partie 1)

Exercice 1 : Exemple de Sécurité mode Message et authentification Windows

Objectifs:

Dans cet exercice, vous devez sécuriser le service TradingService en utilisant une sécurité de type Message et une authentification Windows. Vous devez également contrôler les autorisations d’accès à l’aide de l’attribut PrincipalPermission.

Points Clefs:

Prenez le temps de comprendre l’attribut [PrincipalPermission] et les options de sécurité associé à la liaison wsHttpBinding.

Etape 1. Ajout des comptes utilisateurs.

Préalablement, ajoutez deux comptes utilisateurs de votre choix dans les utilisateurs locaux de la machine. Dans notre exemple, les comptes jdupuy et pafore sont ajoutés.

1. Dans les Outils d’administration, sélectionnez Gestion de l’ordinateur.

2. Dans l’arborescence de gauche, sélectionnez Utilisateurs et groupes locaux (dans [Gestion de l’ordinateur (local)] [Outils système]).

3. Affichez le menu contextuel associé à Utilisateurs à l’aide du bouton droit de la souris, puis sélectionnez Nouvel utilisateur…

4. Remplissez le formulaire Nouvel utilisateur en précisant le nom d’utilisateur jdupuy et un mot de passe de votre choix. Assurez vous que l’option L’utilisateur doit changer le mot de passe à la prochaine ouverture de session est décochée comme précisée dans l’image 1.1.

5. Appuyez ensuite sur Créer.

clip_image002[6]Image 1.1 – Création des comptes utilisateurs

6. Reprenez les étapes précédentes et effectuez de même pour le compte utilisateur pafore.

7. Assurez vous que les deux comptes jdupuy et pafore sont bien listés dans les utilisateurs. Fermez ensuite la console Gestion de l’ordinateur.

Etape 2. Ouvrez le projet TradingService que vous avez développé précédemment.

Etape 3. Configuration de la sécurité par Message et utilisation de l’authentification Windows.

La liaison wsHttpBinding est sécurisée par défaut avec le mode Message et une authentification Windows. Pour plus de clarté, précisez toutefois ces éléments dans le fichier App.config du projet TradingHost comme indiqué dans le fichier de configuration suivant.

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <system.serviceModel>

    <behaviors>

      <serviceBehaviors>

        <behavior name="TradingServiceBehavior">

          <serviceMetadata httpGetEnabled="true" />

        </behavior>

      </serviceBehaviors>

    </behaviors>

    <bindings>

      <wsHttpBinding>

        <binding name="SecurityMessage">

          <security mode="Message">

            <message clientCredentialType="Windows" />

          </security>

        </binding>

      </wsHttpBinding>

    </bindings>

    <services>

      <service behaviorConfiguration="TradingServiceBehavior" name="TradingService.TradingService">

        <endpoint address="http"

                  binding="wsHttpBinding"

                  bindingConfiguration="SecurityMessage"

                  contract="TradingService.ITradingService" />

        <endpoint address="mex"

                  binding="mexHttpBinding"

                  bindingConfiguration=""

                  contract="IMetadataExchange" />

        <host>

          <baseAddresses>

            <add baseAddress="http://localhost:8000/TradingService" />

          </baseAddresses>

        </host>

      </service>

    </services>

  </system.serviceModel>

</configuration>

 

Etape 4. Ajout des autorisations d’accès sur le service TradingService.

Modifiez le fichier TradingService.cs en décorant les méthodes InitTransactions et AjoutTransaction avec l’attribut PrincipalPermission comme précisé dans le code suivant. N’oubliez pas de rajouter le namespace System.Security.Permissions.

Ce code permet de contrôler l’accès des méthodes. L’utilisateur jdupuy est le seul compte autorisé pour AjoutTransaction ; jdupuy et pafore ont tous les deux la permission d’accès à la méthode InitTransactions. Modifiez JDUPUY-VISTA par le nom de votre machine. 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.ServiceModel;

using System.Security.Permissions;

 

namespace TradingService

{

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]

    public class TradingService : ITradingService

    {

        private decimal addition = 0;

        string dealIdentifier;

 

        #region ITradingService Membres

 

        [PrincipalPermission(SecurityAction.Demand, Name = @"JDUPUY-VISTA\pafore")]

        [PrincipalPermission(SecurityAction.Demand, Name = @"JDUPUY-VISTA\jdupuy")]

        public string InitTransactions()

        {

            dealIdentifier = Guid.NewGuid().ToString();

            Console.WriteLine("Initialisation des transactions. Identifiant: {0}", dealIdentifier);

            Console.WriteLine("SessionId : {0}", OperationContext.Current.SessionId);

            return dealIdentifier;

        }

 

        [PrincipalPermission(SecurityAction.Demand, Name = @"JDUPUY-VISTA\jdupuy")]

        public void AjoutTransaction(Transaction transaction)

        {

            decimal somme = 0;

 

            if (transaction.Symbole.Equals("MSFT"))

            {

                somme = (decimal)transaction.Nombre * 18;

            }

 

            addition += somme;

            Console.WriteLine(string.Format("Ajout transaction : {0} - {1}$", transaction, somme));

Etape 5. Compilez le projet (Ctrl+Shift+B) pour vérifier qu’aucune erreur n’a été commise précédemment. Corrigez les éventuels problèmes.

Etape 6. Via le menu contextuel du projet TradingHost, définissez celui-ci comme projet de démarrage. Le projet TradingHost doit apparaitre maintenant en gras dans l’IDE de Visual Studio.NET.

Etape 7. Démarrez le projet (Ctrl+F5) pour affichez l’application console en dehors du debugger.

Etape 8. Ouvrez le fichier Program.cs du projet TradingClient

Modifiez l’identité cliente utilisés par le proxy pour lui permettre d’utiliser le compte jdupuy. Ce compte utilisateur sera alors utilisé pour contacter le service TradingService. Remplacez JDUPUY-VISTA par le nom de votre machine.

namespace TradingClient

{

    class Program

    {

        static void Main(string[] args)

        {

            using (ServiceReference.TradingServiceClient proxy = new ServiceReference.TradingServiceClient())

            {

                proxy.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("JDUPUY-VISTA\\jdupuy", "password");

 

                Console.WriteLine("Pressez une touche lorsque le service est disponible.");

                Console.ReadKey();

 

                proxy.InitTransactions();

 

                Transaction trade = new Transaction();

                trade.Nombre = 10;

                trade.Symbole = "MSFT";

 

                proxy.AjoutTransaction(trade);

                proxy.AjoutTransaction(trade);

 

                decimal dealValue = proxy.Addition();

                Console.WriteLine(string.Format("Estimation de l'ensemble des transactions à ${0}", dealValue));

               

                proxy.Validation();

                proxy.FinTransactions();

 

                proxy.Close();

 

                Console.WriteLine();

                Console.WriteLine("Done.");

                Console.ReadKey();

            }  

        }

    }

}

Etape 9. Compilez le projet (Ctrl+Shift+B) pour vérifier qu’aucune erreur n’a été commise précédemment. Corrigez les éventuels problèmes.

Etape 10. Via le menu contextuel du projet TradingClient, définissez celui-ci comme projet de démarrage. Le projet TradingClient doit apparaitre maintenant en gras dans l’IDE de Visual Studio.NET.

Etape 11. Démarrez le projet (F5) pour affichez l’application console. Le client et le service doivent fonctionner correctement.

Etape 12. Stoppez l’application cliente et remplacez une nouvelle fois l’identité utilisée par le proxy dans Program.cs. L’utilisateur pafore remplace jdupuy pour accéder au service.

[…]

                proxy.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("JDUPUY-VISTA\\pafore", "password");

[…]

Etape 13. Compilez et Démarrez le projet (F5) pour affichez l’application console. Une erreur de type SecurityAccessDeniedException intervient sur l’appel de la méthode AjoutTransaction pour signaler que l’utilisateur pafore n’est pas autorisé.

clip_image002

Note : Ce type d’exception doit être géré dans votre code par un système de try/catch.

Windows Communication Foundation Hands-On Lab : Fondamentaux (Partie 4)

Exercice 4. Utilisation des sessions avec le binding wsHttpBinding

Objectifs:

Le comportement par défaut de WCF en basicHttpBinding est d’instancier le service pour chaque appel de méthode (comportement stateless) comme en web service asmx. Nous voulons dans cet exercice modifier le comportement du service WCF pour générer une unique instance de service par session cliente.

Points Clefs:

Utilisation de l’attribut ServiceBehavior et des arguments SessionMode/InstanceContextMode.

Etape 1. Ouvrez le fichier ITradingService.cs du projet TradingService. Ajoutez l’argument SessionMode à l’attribut ServiceContrat de l’interface ITradingService, comme déclaré ci-dessous.

    [ServiceContract(SessionMode = SessionMode.Required)]

    public interface ITradingService

    {

        [OperationContract]

        string InitTransactions();

        [OperationContract]

        void AjoutTransaction(Transaction transaction);

        [OperationContract]

        decimal Addition();

        [OperationContract]

        void Validation();

        [OperationContract]

        void FinTransactions();

    }

Dans le même fichier, modifiez l’attribut OperationContract avec les propriétés IsInitiating et IsTerminating pour préciser quelle méthode Initie et Termine la session.

Etape 2. Ouvrez le fichier TradingService.cs du projet TradingService. Modifiez le comportement de votre service WCF en ajoutant l’attribut ServiceBehavior et l’argument InstanceContextMode, comme déclaré ci-dessous. N’oubliez pas de rajouter le namespace System.ServiceModel pour que l’attribut ServiceBehavior soit pris en compte.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceModel;

 

namespace TradingService

{

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]

    public class TradingService : ITradingService

    {

        private decimal addition = 0;

        string dealIdentifier;

[…]

Etape 3. basicHttpBinding ne supporte pas les sessions, il est donc nécessaire de modifier le binding utilisé en le remplaçant par wsHttpBinding.

1. Ouvrez le fichier App.config du projet TradingHost.

2. Modifiez le contenu du fichier de configuration pour utiliser le binding wsHttpBinding au lieu de basicHttpBinding

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    <system.serviceModel>

        <behaviors>

            <serviceBehaviors>

                <behavior name="TradingServiceBehavior">

                    <serviceMetadata httpGetEnabled="true" />

                </behavior>

            </serviceBehaviors>

        </behaviors>

        <services>

            <service behaviorConfiguration="TradingServiceBehavior" name="TradingService.TradingService">

                <endpoint address="http"

                          binding="wsHttpBinding"

                          bindingConfiguration=""

                          contract="TradingService.ITradingService" />

                <endpoint address="mex"

                          binding="mexHttpBinding"

                          bindingConfiguration=""

                          contract="IMetadataExchange" />

                <host>

                    <baseAddresses>

                        <add baseAddress="http://localhost:8000/TradingService" />

                    </baseAddresses>

                </host>

            </service>

        </services>

    </system.serviceModel>

</configuration>

Etape 4. Recompilez le projet TradingService, puis TradingHost. Corrigez les éventuelles erreurs de compilation.

Etape 5. Lancez une instance du projet TradingHost.

Etape 6. A l’aide du bouton droit de la souris, ouvrez le menu contextuel de la section ServiceReference dans le projet TradingClient. Sélectionnez l’option permettant de mettre à jour la référence de votre service WCF (image 4.1). Les fichiers Reference.cs et app.config seront mis à jours avec les informations de ce nouveau binding.

clip_image002
Image 4.1 - Mise à jour de la référence

Etape 7. Recompilez le client TradingClient. Corrigez les éventuelles erreurs de compilation.

Etape 8. Lancez une nouvelle instance du Host (TradingHost) puis du Client (TradingClient). Votre projet doit maintenant bénéficier des sessions. Etudiez l’affichage des consoles du client et du host.

clip_image004Image 4.2 - TradingClient

clip_image006Image 4.3 – TradingHost

Windows Communication Foundation Hands-On Lab : Fondamentaux (Partie 3)

Exercice 3. Développement d’une application cliente pour consommer le service WCF.

Objectifs:

Développer une application console permettant de consommer le service WCF précédemment créé.

Points Clefs:

Etudiez le contenu du proxy (Reference.cs) et du fichier de config (App.config) générés par Visual Studio .NET.

Etape 1. Ajoutez un deuxième projet console C# à votre solution TradingSolution, nommez le TradingClient comme indiqué dans l’image 3.1.

clip_image002 3.1 – Ajout du projet console TradingClient

Etape2. Générez, à l’aide de Visual Studio .NET, le proxy et le fichier de configuration pour consommer le service WCF.

1. Lancez une nouvelle instance du projet console TradingHost si celui-ci a été arrêté précédemment (Ctrl+F5).

2. Affichez le menu contextuel de la section ‘Références’ du projet TradingClient. Sélectionnez l’option ‘Ajouter une référence de service…’ comme précisé ci-dessous.

clip_image004

3. Précisez l’adresse http://localhost:8000/TradingService?wsdl dans le premier champ de la boite de dialogue (image 3.2). Elle désigne le fichier WSDL de votre service WCF. Visual Studio .NET va utiliser ces informations pour générer automatiquement le proxy et le fichier de configuration client.

clip_image006Image 3.2 – Ajout d’une référence au service WCF.

4. Cliquez sur le bouton Afficher tous les fichiers dans l’explorateur de solutions.

clip_image008

5. Etudiez le contenu des fichiers Reference.cs (disponible dans l’arborescence de votre projet, dans la section [Service References][ServiceReference][Reference.svcmap]) et App.config. Reference.cs contient le code du proxy, une classe dérivée de System.ServiceModel.ClientBase, celle-ci implémente la logique transport pour dialoguer avec le service WCF distant.

Note : Ces mêmes fichiers peuvent être générés en dehors de Visual Studio .NET, à l’aide de l’outil svcutil.exe.

Exemple:
svcutil http://localhost:8000/TradingService?wsdl /out:reference.cs /config:app.config

Etape 3. Modifiez le code de Program.cs afin d’appeler les méthodes du service WCF distant.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using TradingClient.ServiceReference;

 

namespace TradingClient

{

    class Program

    {

        static void Main(string[] args)

        {

            using (ServiceReference.TradingServiceClient proxy = new ServiceReference.TradingServiceClient())

            {

                Console.WriteLine("Pressez une touche lorsque le service est disponible.");

                Console.ReadKey();

 

                proxy.InitTransactions();

 

                Transaction trade = new Transaction();

                trade.Nombre = 10;

                trade.Symbole = "MSFT";

               

                proxy.AjoutTransaction(trade);

                proxy.AjoutTransaction(trade);

 

                decimal dealValue = proxy.Addition();

                Console.WriteLine(string.Format("Estimation de l'ensemble des transactions à ${0}", dealValue));

 

                proxy.Validation();

                proxy.FinTransactions();

 

                proxy.Close();

 

                Console.WriteLine();

                Console.WriteLine("Done.");

                Console.ReadKey();

            }

        }

    }

}

Etape 4. Compilez le Projet TradingClient, corrigez les éventuelles erreurs de compilation.

Etape 5. Configurez Visual Studio .NET 2008 pour lancer les deux projets consoles (TradingHost et TradingClient) à la suite.

1. Via le menu contextuel de la solution TradingSolution, sélectionnez Définir les projets de démarrage…

2. Sélectionnez l’option Plusieurs projets de démarrage. Précisez l’action Démarrer pour les projets TradingClient et TradingHost. De plus, à l’aide des flèches sur le coté droit, faites en sorte que le projet TradingHost démarre avant TradingClient. Vous devez obtenir le résultat indiqué dans l’image 3.3.

clip_image002[6]Image 3.3 – Configuration pour démarrer plusieurs projets.

Etape 6. Lancez les projets (F5), sélectionnez l’application cliente puis pressez une touche.

Question : Pourquoi l’estimation de l’ensemble des transactions est égale à 0$ ?

clip_image004[6]

Windows Communication Foundation Hands-On Lab : Fondamentaux (Partie 2)

Execice 2 - Hébergement du Service WCF dans une application console .NET

Objectifs:

L’exercice précédent a permis de définir et d’implémenter le service WCF de transactions boursières. Celui-ci réside dans une assembly, il est maintenant nécessaire d’héberger ce service dans une application .NET (ex. Application Console, Application WinForm, Site Web, Service NT) afin de pouvoir exécuter celui-ci. Dans l’exemple proposé ci-dessous, notre service boursier sera hébergé dans une application console.

Points Clefs:

Prenez le temps de comprendre l’utilisation de la classe ServiceHost (dans Program.cs) et les options du fichier de configuration App.config.

Etape 1. Ajoutez un nouveau projet console (Language C#) à la solution.

1. (Ouvrez le menu contextuel de la solution TradingSolution, sélectionnez ensuite les sections [Ajouter][Nouveau Projet…] ).

2. Sélectionnez le modèle Application Console, nommez votre projet TradingHost comme indiqué ci-dessous dans l’image 2.1.

clip_image002Image 2.1 – Création d’un nouveau projet console.

 

Etape 2. Ajoutez une référence à l’assembly System.ServiceModel comme dans l’exemple 1.

Etape 3. Ajoutez une référence au projet réalisé précédemment (TradingService). Suivez la même démarche que pour rajouter une référence sur une assembly du framework. Toutefois, dans la boîte de dialogue Ajouter une Référence, sélectionnez l’onglet Projets comme indiqué dans l’image 2.2 au lieu de l’onglet .NET.

clip_image002[6]Image 2.2 – Ajout de l’assembly TradingService dans les références.


Etape 4.
 Modifiez le code de Program.cs afin d’héberger le service TradingService dans l’application console TradingHost.

using System;

using System.Collections.Generic;

using System.Text;

using System.ServiceModel;

using TradingService;

 

namespace TradingHost

{

    class Program

    {

        static void Main(string[] args)

        {

            using (ServiceHost host = new ServiceHost(typeof(TradingService.TradingService)))

            {

                host.Open();

 

                Console.WriteLine("Le service de transactions boursières est disponible.");

                Console.ReadKey();

 

                host.Close();

            }

        }

    }

} 

Etape 5. Ajoutez un fichier de configuration nommé App.config au projet TradingHost.

1. Utilisez le menu contextuel du projet TradingHost, puis sélectionnez les sections [Ajouter][Nouvel élément…].

2. Sélectionnez le modèle ‘Fichier de configuration de l’application’ comme décrit ci-dessous.

clip_image002[8] Image 2.3 – Création du fichier de configuration.

 

Etape 6. Copiez le contenu du fichier suivant dans le fichier App.config.

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

    <system.serviceModel>

        <behaviors>

            <serviceBehaviors>

                <behavior name="TradingServiceBehavior">

                    <serviceMetadata httpGetEnabled="true" />

                </behavior>

            </serviceBehaviors>

        </behaviors>

        <services>

            <service behaviorConfiguration="TradingServiceBehavior" name="TradingService.TradingService">

                <endpoint address="http"

                          binding="basicHttpBinding"

                          bindingConfiguration=""

                          contract="TradingService.ITradingService" />

                <endpoint address="mex"

                          binding="mexHttpBinding"

                          bindingConfiguration=""

                          contract="IMetadataExchange" />

                <host>

                    <baseAddresses>

                        <add baseAddress="http://localhost:8000/TradingService" />

                    </baseAddresses>

                </host>

            </service>

        </services>

    </system.serviceModel>

</configuration>

Etape 7. Compilez le projet (Ctrl+Shift+B) pour vérifier qu’aucune erreur n’a été commise précédemment. Corrigez les éventuels problèmes.

Etape 8. Via le menu contextuel du projet TradingHost, définissez celui-ci comme projet de démarrage. Le projet TradingHost doit apparaitre maintenant en gras dans l’IDE de Visual Studio.NET.

Etape 9. Démarrez le projet (Ctrl+F5) pour affichez l’application console.

Etape 10. Testez si le service est bien exposé.

1. Ouvrez Internet Explorer et parcourez l’adresse précisé ci-dessous, la page d’invitation de votre service doit apparaitre comme dans l’image 2.4.

http://localhost:8000/TradingService

clip_image002[10]
Image 2.10 – Page d’invitation du service TradingService

2. Cliquez le lien http://localhost:8000/TradingService?wsdl et examinez le contenu du fichier WSDL généré.

Windows Communication Foundation Hands-On Lab : Fondamentaux (Partie 1)

Exercice 1 : Définition et Implémentation du Contrat

Objectifs:

Dans cet exercice, vous allez développer une nouvelle assembly permettant de définir et d’implémenter le contrat de votre service. L’exemple en question expose un service de transaction boursière, l’implémentation est minimaliste afin de se focaliser principalement sur les aspects techniques de Windows Communication Foundation.

Points Clefs:

Prenez le temps de comprendre les attributs [ServiceContract], [OperationContract], [DataContract] et [DataMember].

Etape 1. Ouvrez Visual Studio.NET 2008, puis créez une nouvelle solution intitulée TradingSolution dans le répertoire C:\WCF, comme indiqué dans l’image 1.1.

[Fichier][Nouveau][Projet…]

clip_image002[12] Image 1.1 - Création d’une solution vide avec Visual Studio .NET 2008 -

 

Etape 2. Ajoutez un nouveau projet Visual C#, de type Bibliothèque de classes, intitulé TradingService, comme indiqué dans l’image 1.2.

[Fichier][Ajouter][Nouveau Projet…]

clip_image002[14] Image 1.2 - Création d’un nouveau projet de type Bibliothèque de classes -

Etape 3. Ajoutez les assembly System.ServiceModel et System.Runtime.Serialization dans les références de votre projet TradingService.

1. Affichez le menu contextuel de la section Références de votre projet à l’aide du bouton droit de la souris, puis sélectionnez Ajouter une Référence…

2. Dans l’onglet .NET, sélectionnez l’assembly System.ServiceModel comme indiqué dans l’image 1.3.

clip_image002[8]Image 1.3 - Ajout de la référence System.ServiceModel -

3. Effectuez la même opération pour l’assembly System.Runtime.Serialization.

Etape 4. Définissez le contrat exposé par le service TradingService.

1. Renommez, en utilisant l’environnement Visual Studio .NET, le fichier Class1.cs. Il doit maintenant se nommer ITradingService.cs.

Note: Répondez Oui à la question suivante :
Vous renommez un fichier. Souhaitez-vous également renommer dans ce projet toutes les références à l'élément de code 'Classe1' ?

Le nom de la classe est automatiquement modifié en ITradingService.

2. Modifiez ensuite le contenu de ITradingService.cs, comme indiqué dans la portion de code suivante.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceModel;

 

namespace TradingService

{

    [ServiceContract]

    public interface ITradingService

    {

        [OperationContract]

        string InitTransactions();

        [OperationContract]

        void AjoutTransaction(Transaction transaction);

        [OperationContract]

        decimal Addition();

        [OperationContract]

        void Validation();

        [OperationContract]

        void FinTransactions();

    }

}

Cette interface permet de déclarer les méthodes exposées par le service WCF. Il s’agit d’une interface classique, elle est simplement décoré à l’aide des attributs [ServiceContract] et [OperationContract]. Notre service de transactions boursières contient donc 4 méthodes.

InitTransactions Initie une série de transactions boursières
AjoutTransaction Ajoute une transaction
Addition Additionne le montant des précédentes transactions
Validation Confirme l’ordre de transaction
FinTransactions Clôture la série de transactions

Etape 5. Définissez la classe Transaction utilisée dans le contrat précédent. Comme dans le cas de l’interface, la syntaxe de la classe est classique. Les attributs [DataContract] et [DataMember] sont simplement rajoutés pour indiquer à WCF quelles types/membres seront sérialisés (terme à définir pendant la formation) entre le client et le service.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceModel;

using System.Runtime.Serialization;

 

namespace TradingService

{

    [ServiceContract]

    public interface ITradingService

    {

        [OperationContract]

        string InitTransactions();

        [OperationContract]

        void AjoutTransaction(Transaction transaction);

        [OperationContract]

        decimal Addition();

        [OperationContract]

        void Validation();

        [OperationContract]

        void FinTransactions();

    }

 

    [DataContract]

    public class Transaction

    {

        [DataMember]

        public string Symbole;

        [DataMember]

        public long Nombre;

 

        public override string ToString()

        {

            return string.Format("{0}x{1}", this.Nombre.ToString(), this.Symbole);

        }

    }

}

Cette classe Transaction contient deux variables membres publiques :

Symbole Symbole de l’action (par exemple MSFT)
Nombre Quantité d’actions

La méthode ToString retourne simplement sous forme de chaîne de caractère les variables membres précédentes.

Etape 6. Implémentez le contrat exposé par le service TradingService.

1. Ajoutez une nouvelle classe au projet TradingService (utilisez le menu contextuel du projet, puis sélectionnez les sections [Ajouter][Nouvel élément…].

2. Sélectionnez le modèle Classe, nommez le TradingService.cs comme indiqué dans l’image 1.4


clip_image002[16] Image 1.4 - Ajout d’une nouvelle classe au projet

3. Dans le nouveau fichier TradingService.cs, faites hériter la classe TradingService de l’interface ITradingService comme décrit ci-dessous. Note: La classe doit être publique.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace TradingService

{

    public class TradingService : ITradingService

    {

    }

}

4. Positionnez le curseur de la souris sur ITradingService, puis utilisez le raccourci Shift+Alt+F10 pour afficher la balise active (ou sélectionnez celle-ci directement). Demandez à Visual Studio d’implémenter automatiquement l’interface. Complétez ensuite les méthodes pour obtenir le code suivant.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace TradingService

{

    public class TradingService : ITradingService

    {

        private decimal addition = 0;

        string dealIdentifier;

 

        #region ITradingService Membres

 

        public string InitTransactions()

        {

            dealIdentifier = Guid.NewGuid().ToString();

            Console.WriteLine("Initialisation des transactions. Identifiant: {0}", dealIdentifier);

            return dealIdentifier;

        }

 

        public void AjoutTransaction(Transaction transaction)

        {

            decimal somme = 0;

 

            if (transaction.Symbole.Equals("MSFT"))

            {

                somme = (decimal)transaction.Nombre * 18;

            }

 

            addition += somme;

            Console.WriteLine(string.Format("Ajout transaction : {0} - {1}$", transaction, somme));

 

        }

 

        public decimal Addition()

        {

            return addition;

        }

 

        public void Validation()

        {

            Console.WriteLine("Validation - Achat effectué!");

        }

 

        public void FinTransactions()

        {

            Console.WriteLine("Transactions terminées! Identifiant: {0}", dealIdentifier);

        }

 

        #endregion

    }

}

Etape 7. Compilez le projet (Ctrl+Shift+B) pour vérifier qu’aucune erreur n’a été commise précédemment. Corrigez les éventuels problèmes avant de passer à l’étape suivante.

 

Page view tracker