Procédure pas à pas : utilisation des services d'application cliente

Cette rubrique décrit comment créer une application Windows qui utilise des services d'application cliente pour authentifier les utilisateurs et extraire des rôles d'utilisateur et des paramètres.

Dans cette procédure pas à pas, vous allez effectuer les tâches suivantes :

  • Création d'une application Windows Forms et utilisation du concepteur de projets Visual Studio pour activer et configurer les services d'application cliente.

  • Création d'une application de service Web ASP.NET simple pour héberger les services d'application et tester votre configuration client.

  • Ajout de l'authentification par formulaire à votre application. Vous commencerez par utiliser un nom d'utilisateur et un mot de passe codés en dur pour tester le service. Vous ajouterez ensuite un formulaire de connexion en le définissant comme un fournisseur d'informations d'identification dans la configuration de l'application.

  • Ajout de fonctionnalités basées sur les rôles, avec activation et affichage d'un bouton uniquement pour les utilisateurs ayant le rôle de gestionnaire.

  • Accès aux paramètres Web. Vous commencerez par charger les paramètres Web pour un utilisateur authentifié (test) sur la page Paramètres du concepteur de projets. Vous utiliserez ensuite le concepteur Windows Forms pour lier une zone de texte à un paramètre Web. Enfin, vous enregistrerez la valeur modifiée sur le serveur.

  • Implémentation de la déconnexion. Vous ajouterez une option de déconnexion au formulaire et appellerez une méthode de déconnexion.

  • Activation du mode hors connexion. Vous fournirez une case à cocher afin que les utilisateurs puissent spécifier leur état de connexion. Vous utiliserez ensuite cette valeur pour spécifier si les fournisseurs de services d'application cliente utiliseront les données mises en cache localement au lieu d'accéder à leurs services Web. Enfin, vous authentifierez une nouvelle fois l'utilisateur en cours lorsque l'application repassera en mode en ligne.

Composants requis

Vous avez besoin du composant suivant pour exécuter cette procédure pas à pas :

  • Visual Studio 2008.

Création de l'application cliente

La première chose à faire est de créer un projet Windows Forms. Cette procédure pas à pas utilise des projets Windows Forms car ils sont davantage connus, mais le processus est semblable pour les projets Windows Presentation Foundation (WPF).

Pour créer une application cliente et activer les services d'application cliente

  1. Dans Visual Studio, sélectionnez l'option de menu Fichier | Nouveau | Projet.

  2. Dans le volet Types de projets de la boîte de dialogue Nouveau projet, développez le nœud Visual Basic ou Visual C# et sélectionnez le type de projet Windows.

  3. Assurez-vous que .NET Framework 3.5 est sélectionné, puis sélectionnez le modèle Application Windows Forms.

  4. Remplacez le Nom du projet par ClientAppServicesDemo, puis cliquez sur OK.

    Un nouveau projet Windows Forms est ouvert dans Visual Studio.

  5. Dans le menu Projet, sélectionnez ClientAppServicesDemo Properties.

    Le concepteur de projets apparaît.

  6. Sous l'onglet Services, sélectionnez Activer les services d'application cliente.

  7. Assurez-vous que l'option Utiliser l'authentification par formulaire est sélectionnée, puis affectez à Emplacement du service d'authentification, Emplacement des services de rôles et Emplacement des services de paramètres Web la valeur https://localhost:55555/AppServices.

  8. Pour Visual Basic, sous l'onglet Application, affectez à Mode d'authentification la valeur Défini au niveau de l'application.

Le concepteur stocke les paramètres spécifiés dans le fichier app.config de l'application.

À ce stade, l'application est configurée pour accéder aux trois services du même hôte. Dans la section suivante, vous créerez l'hôte comme une application de service Web simple, ce qui vous permettra de tester votre configuration client.

Création de l'hôte de services d'application

Dans cette section, vous allez créer une application de service Web simple qui accède aux données utilisateur à partir d'un fichier de base de données SQL Server Compact 3.5 local. Vous allez ensuite renseigner la base de données à l'aide de Outil Administration de site Web ASP.NET. Cette configuration simple vous permet de tester votre application cliente rapidement. Vous pouvez également configurer l'hôte de service Web de façon à ce qu'il accède aux données utilisateur d'une base de données SQL Server complète ou via un MembershipProvider et des classes RoleProvider personnalisés. Pour plus d'informations, consultez Création et configuration de la base de données des services d'application pour SQL Server.

Dans la procédure suivante, vous créez et configurez le service Web AppServices.

Pour créer et configurer l'hôte de services d'application

  1. Dans l'Explorateur de solutions, sélectionnez la solution ClientAppServicesDemo, puis dans le menu Fichier, sélectionnez Ajout | Nouveau projet.

  2. Dans le volet Types de projets de la boîte de dialogue Ajouter un nouveau projet, développez le nœud Visual Basic ou Visual C# et sélectionnez le type de projet Web.

  3. Assurez-vous que .NET Framework 3.5 est sélectionné, puis sélectionnez le modèle Application de service Web ASP.NET.

  4. Remplacez le Nom du projet par AppServices, puis cliquez sur OK.

    Un nouveau projet d'application de service Web ASP.NET est ajouté à la solution et le fichier Service1.asmx.vb ou le fichier Service1.asmx.cs apparaît dans l'éditeur.

    Notes

    Le fichier Service1.asmx.vb et le fichier Service1.asmx.cs ne sont pas utilisés dans cet exemple. Pour que votre environnement de travail ne soit pas encombré, vous pouvez le fermer et le supprimer de l'Explorateur de solutions.

  5. Dans l'Explorateur de solutions, sélectionnez le projet AppServices, puis dans le menu Projet, sélectionnez AppServices Properties.

    Le concepteur de projets apparaît.

  6. Sous l'onglet Web, assurez-vous que l'option Utiliser le serveur de développement Visual Studio est sélectionnée.

  7. Sélectionnez Port spécifique, indiquez la valeur 55555, puis affectez à Chemin d'accès virtuel la valeur /AppServices.

  8. Enregistrez tous les fichiers.

  9. Dans l'Explorateur de solutions, ouvrez Web.config et recherchez la balise d'ouverture <system.web>.

  10. Ajoutez la balise suivante avant la balise <system.web>.

    Les éléments authenticationService, profileService et roleService dans cette balise activent et configurent les services d'application. À des fins de test, la valeur false est affectée à l'attribut requireSSL de l'élément authenticationService. Les attributs readAccessProperties et writeAccessProperties de l'élément profileService indiquent que la propriété WebSettingsTestText est en lecture/écriture.

    Notes

    Dans le code de production, vous devez toujours accéder au service d'authentification sur la couche de sockets sécurisée (SSL, en utilisant le protocole HTTPS). Pour plus d'informations sur la configuration de SSL, consultez Configuration de SSL (Secure Sockets Layer) (Guide des opérations IIS 6.0).

    <system.web.extensions>
      <scripting>
        <webServices>
          <authenticationService enabled="true" requireSSL = "false"/>
          <profileService enabled="true"
            readAccessProperties="WebSettingsTestText"
            writeAccessProperties="WebSettingsTestText" />
          <roleService enabled="true"/>
        </webServices>
      </scripting>
    </system.web.extensions>
    
  11. Ajoutez la balise suivante après la balise d'ouverture <system.web> pour qu'elle soit dans l'élément <system.web>.

    L'élément profile configure un paramètre Web unique nommé WebSettingsTestText.

    <profile enabled="true" >
      <properties>
        <add name="WebSettingsTestText" type="string" 
          readOnly="false" defaultValue="DefaultText" 
          serializeAs="String" allowAnonymous="false" />
      </properties>
    </profile>
    

Dans la procédure suivante, vous utilisez l'outil d'administration de Site Web ASP.NET pour terminer la configuration du service et renseigner le fichier de base de données local. Vous allez ajouter deux utilisateurs nommés employé et manager qui appartiennent à deux rôles portant le même nom. Les mots de passe de ces utilisateurs sont respectivement employee! et manager!.

Pour configurer l'appartenance et les rôles

  1. Dans l'Explorateur de solutions, sélectionnez le projet AppServices, puis dans le menu Projet, sélectionnez Configuration ASP.NET.

    L'outil Administration de site Web ASP.NET apparaît.

  2. Sous l'onglet Sécurité, cliquez sur Utilisez l'Assistant Installation de sécurité pour configurer la sécurité étape par étape.

    L'Assistant Installation de sécurité apparaît et affiche l'étape Bienvenue.

  3. Cliquez sur Suivant.

    L'étape Sélectionnez une méthode d'accès apparaît.

  4. Sélectionnez À partir d'internet. Cela configure le service pour utiliser l'authentification par formulaire au lieu de l'authentification Windows.

  5. Cliquez ensuite sur Suivant deux fois.

    L'étape Définissez les rôles apparaît.

  6. Sélectionnez Activez les rôles pour ce site Web..

  7. Cliquez sur Suivant. Le formulaire Créez un nouveau rôle apparaît.

  8. Dans la zone de texte Nouveau nom de rôle, entrez manager, puis cliquez sur Ajouter le rôle.

    La table Rôles existants apparaît avec la valeur spécifiée.

  9. Dans la zone de texte Nouveau nom de rôle, remplacez manager par employé, puis cliquez sur Ajouter le rôle.

    La nouvelle valeur apparaît dans la table Rôles existants.

  10. Cliquez sur Suivant.

    L'étape Ajoutez de nouveaux utilisateurs s'affiche.

  11. Dans le formulaire Créer un utilisateur, spécifiez les valeurs suivantes.

    Nom d'utilisateur

    manager

    Mot de passe

    manager!

    Confirmer le mot de passe

    manager!

    Adresse de messagerie

    manager@contoso.com

    Question de sécurité

    manager

    Réponse de sécurité

    manager

  12. Cliquez sur Créer un utilisateur.

    Un message indiquant la réussite de l'opération s'affiche.

    Notes

    Les valeurs Adresse de messagerie, Question de sécurité et Réponse de sécurité sont requises par le formulaire, mais ne sont pas utilisées dans cet exemple.

  13. Cliquez sur Continuer.

    Le formulaire Créer un utilisateur s'affiche de nouveau.

  14. Dans le formulaire Créer un utilisateur, spécifiez les valeurs suivantes.

    Nom d'utilisateur

    employé

    Mot de passe

    employee!

    Confirmer le mot de passe

    employee!

    Adresse de messagerie

    employé@contoso.com

    Question de sécurité

    Employé

    Réponse de sécurité

    employé

  15. Cliquez sur Créer un utilisateur.

    Un message indiquant la réussite de l'opération s'affiche.

  16. Cliquez sur Terminer.

    L'outil Administration de site Web ASP.NET s'affiche de nouveau.

  17. Cliquez sur les utilisateurs Gestionnaire.

    La liste des utilisateurs s'affiche.

  18. Cliquez sur Modifier les rôles pour l'utilisateur employé, puis sélectionnez le rôle employé.

  19. Cliquez sur Modifier les rôles pour l'utilisateur gestionnaire, puis sélectionnez le rôle gestionnaire.

  20. Fermez la fenêtre de navigateur qui héberge l'outil Administration de site Web.

  21. Si un message vous demandant si vous souhaitez recharger le fichier Web.config modifié s'affiche, cliquez sur Oui.

Cela termine la configuration de service Web. À ce stade, vous pouvez appuyer sur F5 pour exécuter l'application cliente. Le Serveur de développement ASP.NET démarre automatiquement avec votre application cliente. Le serveur continue de s'exécuter lorsque vous quittez l'application, mais redémarre en même temps que vous redémarrez l'application. Cela lui permet de détecter les modifications apportées à Web.config.

Pour arrêter le serveur manuellement, cliquez avec le bouton droit sur l'icône Serveur de développement ASP.NET dans la zone de notification de la barre des tâches, puis cliquez sur Arrêt. Il est parfois utile de vérifier qu'un redémarrage normal se produit.

Ajout de l'authentification par formulaire

Dans la procédure suivante, vous ajoutez du code au formulaire principal qui essaie de valider l'utilisateur et refuse l'accès lorsque l'utilisateur fournit des informations d'identification non valides. Vous utilisez un nom d'utilisateur et un mot de passe codés en dur pour tester le service.

Pour valider l'utilisateur dans votre code d'application

  1. Dans l'Explorateur de solutions, ajoutez au projet ClientAppServicesDemo une référence à l'assembly System.Web.

  2. Sélectionnez le fichier Form1, puis sélectionnez Afficher | Code dans le menu principal de Visual Studio.

  3. Dans l'éditeur de code, ajoutez les instructions suivantes en haut du fichier Form1.

    Imports System.Net
    Imports System.Threading
    Imports System.Web.ClientServices
    Imports System.Web.ClientServices.Providers
    Imports System.Web.Security
    
    using System.Net;
    using System.Threading;
    using System.Web.ClientServices;
    using System.Web.ClientServices.Providers;
    using System.Web.Security;
    
  4. Dans l'Explorateur de solutions, double-cliquez sur Form1 pour afficher le concepteur.

  5. Dans le concepteur, double-cliquez sur la surface de formulaire pour générer un gestionnaire d'événements Form.Load nommé Form1_Load.

    L'éditeur de code apparaît avec le curseur dans la méthode Form1_Load.

  6. Ajoutez le code suivant à la méthode Form1_Load.

    Ce code refuse l'accès aux utilisateurs non authentifiés en fermant l'application. Vous pouvez également autoriser l'accès au formulaire aux utilisateurs non authentifiés, mais leur refuser l'accès à des fonctionnalités spécifiques. Normalement, vous ne codez pas en dur le nom d'utilisateur et le mot de passe, mais cela est utile à des fins de test. Dans la section suivante, vous remplacerez ce code par du code plus fiable qui affiche une boîte de dialogue de connexion et inclut la gestion des exceptions.

    Notez que la méthode static Membership.ValidateUser est dans le .NET Framework version 2.0. Cette méthode délègue son travail au fournisseur d'authentification configuré et retourne la valeur true si l'authentification aboutit. Votre application ne requiert pas de référence directe au fournisseur d'authentification du client.

    If Not Membership.ValidateUser("manager", "manager!") Then
    
        MessageBox.Show("Unable to authenticate.", "Not logged in", _
            MessageBoxButtons.OK, MessageBoxIcon.Error)
        Application.Exit()
    
    End If
    
    if (!Membership.ValidateUser("manager", "manager!"))
    {
        MessageBox.Show("Unable to authenticate.", "Not logged in",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
        Application.Exit();
    }
    

Vous pouvez maintenant appuyer sur F5 pour exécuter l'application : étant donné que vous fournissez un nom d'utilisateur et un mot de passe corrects, le formulaire s'affiche.

Notes

Si vous ne pouvez pas exécuter l'application, essayez d'arrêter le serveur de développement ASP.NET. Lorsque le serveur redémarre, vérifiez que le port a la valeur 55555.

Pour afficher à la place le message d'erreur, modifiez les paramètres ValidateUser. Par exemple, remplacez le deuxième paramètre "manager!" par un mot de passe incorrect tel que "MANAGER".

Ajout d'un formulaire de connexion en tant que fournisseur d'informations d'identification

Vous pouvez obtenir les informations d'identification de l'utilisateur dans votre code d'application et les passer à la méthode ValidateUser. Toutefois, il est souvent utile de séparer le code d'acquisition des informations d'identification de votre code d'application, si vous souhaitez le modifier ultérieurement.

Dans la procédure suivante, vous configurez votre application de sorte qu'elle utilise un fournisseur d'informations d'identification, puis modifiez votre appel de méthode ValidateUser afin de passer Empty pour les deux paramètres. Les chaînes vides envoient un signal à la méthode ValidateUser pour appeler la méthode GetCredentials du fournisseur d'informations d'identification configuré.

Pour configurer votre application de sorte qu'elle utilise un fournisseur d'informations d'identification

  1. Dans l'Explorateur de solutions, sélectionnez le projet ClientAppServicesDemo, puis dans le menu Projet, sélectionnez ClientAppServicesDemo Properties.

    Le concepteur de projets apparaît.

  2. Sous l'onglet Services, affectez à Facultatif : Fournisseur d'informations d'identification la valeur suivante. Cette valeur indique le nom de type qualifié d'assembly.

    ClientAppServicesDemo.Login, ClientAppServicesDemo
    
  3. Dans le fichier de code Form1, remplacez le code dans la méthode Form1_Load par le code suivant.

    Ce code affiche un message d'accueil, puis appelle la méthode ValidateUsingCredentialsProvider que vous ajouterez dans l'étape suivante. Si l'utilisateur n'est pas authentifié, la méthode ValidateUsingCredentialsProvider retourne false et la méthode Form1_Load est retournée. Cela empêche tout code supplémentaire de s'exécuter avant la fermeture de l'application. Le message d'accueil est utile pour préciser ce point lorsque l'application redémarre. Vous ajouterez du code pour redémarrer l'application lorsque vous implémenterez la déconnexion à une étape ultérieure de cette procédure.

    MessageBox.Show("Welcome to the Client Application Services Demo.", _
        "Welcome!")
    
    If Not ValidateUsingCredentialsProvider() Then Return
    
    MessageBox.Show("Welcome to the Client Application Services Demo.",
        "Welcome!");
    
    if (!ValidateUsingCredentialsProvider()) return;
    
  4. Ajoutez la méthode suivante après la méthode Form1_Load.

    Cette méthode passe des chaînes vides à la méthode static Membership.ValidateUser, ce qui provoque l'affichage de la boîte de dialogue Connexion. Si le service d'authentification n'est pas disponible, la méthode ValidateUser lève une WebException. Dans ce cas, la méthode ValidateUsingCredentialsProvider affiche un message d'avertissement et demande si l'utilisateur souhaite refaire une tentative en mode hors connexion. Cette fonctionnalité requiert la fonction Enregistrer le hachage de mot de passe localement pour activer la connexion hors connexion décrite dans Comment : configurer les services d'application cliente. Cette fonction est activée par défaut pour les nouveaux projets.

    Si l'utilisateur n'est pas validé, la méthode ValidateUsingCredentialsProvider affiche un message d'erreur et ferme l'application. Enfin, cette méthode retourne le résultat de la tentative d'authentification.

    Private Function ValidateUsingCredentialsProvider() As Boolean
    
        Dim isAuthorized As Boolean = False
    
        Try
    
            ' Call ValidateUser with empty strings in order to display the 
            ' login dialog box configured as a credentials provider.
            isAuthorized = Membership.ValidateUser( _
                String.Empty, String.Empty)
    
        Catch ex As System.Net.WebException
    
            If DialogResult.OK = MessageBox.Show( _
                "Unable to access the authentication service." & _
                Environment.NewLine & "Attempt login in offline mode?", _
                "Warning", MessageBoxButtons.OKCancel, _
                MessageBoxIcon.Warning) Then
    
                ConnectivityStatus.IsOffline = True
                isAuthorized = Membership.ValidateUser( _
                    String.Empty, String.Empty)
    
            End If
    
        End Try
    
        If Not isAuthorized Then
    
            MessageBox.Show("Unable to authenticate.", "Not logged in", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)
            Application.Exit()
    
        End If
    
        Return isAuthorized
    
    End Function
    
    private bool ValidateUsingCredentialsProvider()
    {
        bool isAuthorized = false;
        try
        {
            // Call ValidateUser with empty strings in order to display the 
            // login dialog box configured as a credentials provider.
            isAuthorized = Membership.ValidateUser(
                String.Empty, String.Empty);
        }
        catch (System.Net.WebException)
        {
            if (DialogResult.OK == MessageBox.Show(
                "Unable to access the authentication service." +
                Environment.NewLine + "Attempt login in offline mode?",
                "Warning", MessageBoxButtons.OKCancel, 
                MessageBoxIcon.Warning))
            {
                ConnectivityStatus.IsOffline = true;
                isAuthorized = Membership.ValidateUser(
                    String.Empty, String.Empty);
            }
        }
    
        if (!isAuthorized)
        {
            MessageBox.Show("Unable to authenticate.", "Not logged in",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
            Application.Exit();
        }
        return isAuthorized;
    }
    

Création d'un formulaire de connexion

Un fournisseur d'informations d'identification est une classe qui implémente l'interface IClientFormsAuthenticationCredentialsProvider. Cette interface a une méthode unique nommée GetCredentials qui retourne un objet ClientFormsAuthenticationCredentials. Les procédures suivantes décrivent comment créer une boîte de dialogue de connexion qui implémente GetCredentials pour s'afficher et retourner les informations d'identification spécifiées par l'utilisateur.

Des procédures distinctes sont fournies pour Visual Basic et C# car Visual Basic fournit un modèle Formulaire de connexion. Cela permet d'économiser du temps et des efforts de codage.

Pour créer une boîte de dialogue de connexion comme fournisseur d'informations d'identification dans Visual Basic

  1. Dans l'Explorateur de solutions, sélectionnez le projet ClientAppServicesDemo, puis dans le menu Projet, sélectionnez Ajouter un nouvel élément.

  2. Dans la boîte de dialogue Ajouter un nouvel élément, sélectionnez le modèle Formulaire de connexion, remplacez la valeur Nom de l'article par Login.vb, puis cliquez sur Ajouter.

    La boîte de dialogue de connexion apparaît dans le concepteur Windows Forms.

  3. Dans le concepteur, cliquez sur OK, puis dans la fenêtre Propriétés, affectez à DialogResult la valeur OK.

  4. Dans le concepteur, ajoutez un contrôle CheckBox au formulaire sous la zone de texte Mot de passe.

  5. Dans la fenêtre Propriétés, spécifiez la valeur (Name) rememberMeCheckBox et la valeur Text &Remember me.

  6. Sélectionnez Afficher | Code dans le menu principal de Visual Studio.

  7. Dans l'éditeur de code, ajoutez le code suivant en haut du fichier.

    Imports System.Web.ClientServices.Providers
    
  8. Modifiez la signature de classe pour que la classe implémente l'interface IClientFormsAuthenticationCredentialsProvider.

    Public Class Login
        Implements IClientFormsAuthenticationCredentialsProvider
    
  9. Assurez-vous que le curseur est placé après IClientformsAuthenticationCredentialsProvider, puis appuyez sur ENTRÉE pour générer la méthode GetCredentials.

  10. Localisez l'implémentation GetCredentials, puis remplacez-la par le code suivant.

    Public Function GetCredentials() As  _
        ClientFormsAuthenticationCredentials Implements _
        IClientFormsAuthenticationCredentialsProvider.GetCredentials
    
        If Me.ShowDialog() = DialogResult.OK Then
            Return New ClientFormsAuthenticationCredentials( _
                UsernameTextBox.Text, PasswordTextBox.Text, _
                rememberMeCheckBox.Checked)
        Else
            Return Nothing
        End If
    
    End Function
    

La procédure C# suivante fournit la liste de code complète pour une boîte de dialogue de connexion simple. La disposition de cette boîte de dialogue est un peu brute, mais la partie importante est l'implémentation GetCredentials.

Pour créer une boîte de dialogue de connexion comme fournisseur d'informations d'identification en C#

  1. Dans l'Explorateur de solutions, sélectionnez le projet ClientAppServicesDemo, puis dans le menu Projet, sélectionnez Ajouter une classe.

  2. Dans la boîte de dialogue Ajouter un nouvel élément, remplacez la valeur Nom par Login.cs, puis cliquez sur Ajouter.

    Le fichier Login.cs s'ouvre dans l'éditeur de code.

  3. Remplacez le code par défaut par le code suivant.

    using System.Windows.Forms;
    using System.Web.ClientServices.Providers;
    
    namespace ClientAppServicesDemo
    {
        class Login : Form,
            IClientFormsAuthenticationCredentialsProvider
        {
            private TextBox usernameTextBox;
            private TextBox passwordTextBox;
            private CheckBox rememberMeCheckBox;
            private Button OK;
            private Button cancel;
            private Label label1;
            private Label label2;
    
            public ClientFormsAuthenticationCredentials GetCredentials()
            {
                if (this.ShowDialog() == DialogResult.OK)
                {
                    return new ClientFormsAuthenticationCredentials(
                        usernameTextBox.Text, passwordTextBox.Text,
                        rememberMeCheckBox.Checked);
                }
                else
                {
                    return null;
                }
            }
    
            public Login()
            {
                InitializeComponent();
            }
    
            private void CloseForm(object sender, System.EventArgs e)
            {
                this.Close();
            }
    
            private void InitializeComponent()
            {
                this.label1 = new System.Windows.Forms.Label();
                this.usernameTextBox = new System.Windows.Forms.TextBox();
                this.label2 = new System.Windows.Forms.Label();
                this.passwordTextBox = new System.Windows.Forms.TextBox();
                this.rememberMeCheckBox = new System.Windows.Forms.CheckBox();
                this.OK = new System.Windows.Forms.Button();
                this.cancel = new System.Windows.Forms.Button();
                this.SuspendLayout();
                // 
                // label1
                // 
                this.label1.AutoSize = true;
                this.label1.Location = new System.Drawing.Point(13, 13);
                this.label1.Name = "label1";
                this.label1.Size = new System.Drawing.Size(58, 13);
                this.label1.TabIndex = 0;
                this.label1.Text = "&User name";
                // 
                // usernameTextBox
                // 
                this.usernameTextBox.Location = new System.Drawing.Point(13, 30);
                this.usernameTextBox.Name = "usernameTextBox";
                this.usernameTextBox.Size = new System.Drawing.Size(157, 20);
                this.usernameTextBox.TabIndex = 1;
                // 
                // label2
                // 
                this.label2.AutoSize = true;
                this.label2.Location = new System.Drawing.Point(13, 57);
                this.label2.Name = "label2";
                this.label2.Size = new System.Drawing.Size(53, 13);
                this.label2.TabIndex = 2;
                this.label2.Text = "&Password";
                // 
                // passwordTextBox
                // 
                this.passwordTextBox.Location = new System.Drawing.Point(13, 74);
                this.passwordTextBox.Name = "passwordTextBox";
                this.passwordTextBox.PasswordChar = '*';
                this.passwordTextBox.Size = new System.Drawing.Size(157, 20);
                this.passwordTextBox.TabIndex = 3;
                // 
                // rememberMeCheckBox
                // 
                this.rememberMeCheckBox.AutoSize = true;
                this.rememberMeCheckBox.Location = new System.Drawing.Point(13, 101);
                this.rememberMeCheckBox.Name = "rememberMeCheckBox";
                this.rememberMeCheckBox.Size = new System.Drawing.Size(94, 17);
                this.rememberMeCheckBox.TabIndex = 4;
                this.rememberMeCheckBox.Text = "&Remember me";
                this.rememberMeCheckBox.UseVisualStyleBackColor = true;
                // 
                // OK
                // 
                this.OK.DialogResult = System.Windows.Forms.DialogResult.OK;
                this.OK.Location = new System.Drawing.Point(13, 125);
                this.OK.Name = "OK";
                this.OK.Size = new System.Drawing.Size(75, 23);
                this.OK.TabIndex = 5;
                this.OK.Text = "&OK";
                this.OK.UseVisualStyleBackColor = true;
                // 
                // cancel
                // 
                this.cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
                this.cancel.Location = new System.Drawing.Point(95, 125);
                this.cancel.Name = "cancel";
                this.cancel.Size = new System.Drawing.Size(75, 23);
                this.cancel.TabIndex = 6;
                this.cancel.Text = "&Cancel";
                this.cancel.UseVisualStyleBackColor = true;
                // 
                // Login
                // 
                this.AcceptButton = this.OK;
                this.CancelButton = this.cancel;
                this.ClientSize = new System.Drawing.Size(187, 168);
                this.Controls.Add(this.cancel);
                this.Controls.Add(this.OK);
                this.Controls.Add(this.rememberMeCheckBox);
                this.Controls.Add(this.passwordTextBox);
                this.Controls.Add(this.label2);
                this.Controls.Add(this.usernameTextBox);
                this.Controls.Add(this.label1);
                this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
                this.MaximizeBox = false;
                this.MinimizeBox = false;
                this.Name = "Login";
                this.Text = "Login";
                this.ResumeLayout(false);
                this.PerformLayout();
    
            }
        }
    
    }
    

Vous pouvez maintenant exécuter l'application et voir la boîte de dialogue de connexion. Pour tester ce code, essayez différentes informations d'identification, à la fois valides et non valides, et vérifiez que le formulaire n'est accessible qu'avec des informations d'identification valides. Les noms d'utilisateur valides sont employee et manager avec les mots de passe employee! et manager!.

Notes

À ce stade, ne sélectionnez pas Mémoriser mes informations, car sinon vous ne pourrez pas vous connecter sous une autre identité tant que vous n'aurez pas implémenté la déconnexion à une étape ultérieure de cette procédure.

Ajout de fonctionnalités basées sur les rôles

Dans la procédure suivante, vous ajoutez un bouton au formulaire et l'affichez uniquement pour les utilisateurs ayant le rôle de gestionnaire.

Pour modifier l'interface utilisateur selon le rôle de l'utilisateur

  1. Dans l'Explorateur de solutions, sélectionnez Form1 dans le projet ClientAppServicesDemo, puis sélectionnez Afficher | Concepteur dans le menu principal de Visual Studio.

  2. Dans le concepteur, ajoutez un contrôle Button au formulaire à partir de la Boîte à outils.

  3. Dans la fenêtre Propriétés, définissez les propriétés suivantes pour le bouton.

    Propriété

    Valeur

    (Name)

    managerOnlyButton

    Texte

    &Manager task

    Visible

    False

  4. Dans l'éditeur de code pour Form1, ajoutez le code suivant à la fin de la méthode Form1_Load.

    Ce code appelle la méthode DisplayButtonForManagerRole que vous ajouterez dans l'étape suivante.

    DisplayButtonForManagerRole()
    
    DisplayButtonForManagerRole();
    
  5. Ajoutez la méthode suivante à la fin de la classe Form1.

    Cette méthode appelle la méthode IsInRole du IPrincipal retourné par la propriété static Thread.CurrentPrincipal. Pour les applications configurées pour utiliser les services d'application cliente, cette propriété retourne ClientRolePrincipal. Étant donné que cette classe implémente l'interface IPrincipal, vous n'avez pas besoin de la référencer explicitement.

    Si l'utilisateur a le rôle de gestionnaire, la méthode DisplayButtonForManagerRole affecte à la propriété Visible de managerOnlyButton la valeur true. Si une WebException est levée, cette méthode affiche également un message d'erreur indiquant que le service de rôles n'est pas disponible.

    Notes

    La méthode IsInRole retourne toujours la valeur false si la connexion de l'utilisateur a expiré. Cela ne se produit pas si votre application appelle une fois la méthode IsInRole peu après l'authentification, comme indiqué dans l'exemple de code de cette procédure pas à pas. Si votre application doit extraire des rôles d'utilisateur à d'autres moments, vous souhaitez peut-être ajouter du code pour revalider les utilisateurs dont la connexion a expiré. Si des rôles sont attribués à tous les utilisateurs valides, vous pouvez déterminer si la connexion a expiré en appelant la méthode ClientRoleProvider.GetRolesForUser. Si aucun rôle n'est retourné, la connexion a expiré. Pour obtenir un exemple de cette fonctionnalité, consultez la méthode GetRolesForUser. Cette fonctionnalité n'est requise que si vous avez sélectionné l'option Imposer aux utilisateurs de se reconnecter chaque fois que le cookie du serveur expire dans la configuration de l'application. Pour plus d'informations, consultez Comment : configurer les services d'application cliente.

    Private Sub DisplayButtonForManagerRole()
    
        Try
    
            If Thread.CurrentPrincipal.IsInRole("manager") Then
    
                managerOnlyButton.Visible = True
    
            End If
    
        Catch ex As System.Net.WebException
    
            MessageBox.Show("Unable to access the roles service.", _
                "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    
        End Try
    
    End Sub
    
    private void DisplayButtonForManagerRole()
    {
        try
        {
            if (Thread.CurrentPrincipal.IsInRole("manager"))
            {
                managerOnlyButton.Visible = true;
            }
        }
        catch (System.Net.WebException)
        {
            MessageBox.Show("Unable to access the role service.",
                "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }
    

Si l'authentification aboutit, le fournisseur d'authentification du client affecte à la propriété Thread.CurrentPrincipal une instance de la classe ClientRolePrincipal. Cette classe implémente la méthode IsInRole afin que le travail soit délégué au fournisseur de rôles configuré. Comme avant, votre code d'application ne requiert pas de référence directe au fournisseur de services.

Vous pouvez maintenant exécuter l'application et ouvrir une session en tant qu'employé pour constater que le bouton n'apparaît pas, puis ouvrir une session en tant que gestionnaire pour voir le bouton.

Accès aux paramètres Web

Dans la procédure suivante, vous ajoutez une zone de texte au formulaire et la liez à un paramètre Web. Comme le code précédent qui utilise l'authentification et les rôles, votre code de paramètres n'accède pas directement au fournisseur de paramètres. À la place, il utilise la classe Settings fortement typée (accessible en tant que Properties.Settings.Default en C# et My.Settings en Visual Basic) générée pour votre projet par Visual Studio.

Pour utiliser des paramètres Web dans votre interface utilisateur

  1. Assurez-vous que le Serveur de développement Web ASP.NET s'exécute encore en vérifiant la zone de notification de la barre des tâches. Si vous avez arrêté le serveur, redémarrez l'application (ce qui démarre automatiquement le serveur), puis fermez la boîte de dialogue de connexion.

  2. Dans l'Explorateur de solutions, sélectionnez le projet ClientAppServicesDemo, puis dans le menu Projet, sélectionnez ClientAppServicesDemo Properties.

    Le concepteur de projets apparaît.

  3. Sous l'onglet Paramètres, cliquez sur Charger les paramètres Web.

    La boîte de dialogue Connexion s'affiche.

  4. Entrez les informations d'identification de l'employé ou du gestionnaire et cliquez sur Se connecter. Dans la mesure où le paramètre Web que vous utiliserez est configuré pour être accessible par les utilisateurs authentifiés uniquement, le fait de cliquer sur Ignorer la connexion ne charge aucun paramètre.

    Le paramètre WebSettingsTestText apparaît dans le concepteur avec la valeur par défaut DefaultText. En outre, une classe Settings qui contient une propriété WebSettingsTestText est générée pour votre projet.

  5. Dans l'Explorateur de solutions, sélectionnez Form1 dans le projet ClientAppServicesDemo, puis sélectionnez Afficher | Concepteur dans le menu principal de Visual Studio.

  6. Dans le concepteur, ajoutez un contrôle TextBox au formulaire.

  7. Dans la fenêtre Propriétés, spécifiez la valeur (Name) webSettingsTestTextBox.

  8. Dans l'éditeur de code, ajoutez le code suivant à la fin de la méthode Form1_Load.

    Ce code appelle la méthode BindWebSettingsTestTextBox que vous ajouterez dans l'étape suivante.

    BindWebSettingsTestTextBox()
    
    BindWebSettingsTestTextBox();
    
  9. Ajoutez la méthode suivante à la fin de la classe Form1.

    Cette méthode lie la propriété Text de webSettingsTestTextBox à la propriété WebSettingsTestText de la classe Settings générée précédemment dans cette procédure. Si une WebException est levée, cette méthode affiche également un message d'erreur indiquant que le service de paramètres Web n'est pas disponible.

    Private Sub BindWebSettingsTestTextBox()
    
        Try
    
            Me.webSettingsTestTextBox.DataBindings.Add("Text", _
                My.Settings, "WebSettingsTestText")
    
        Catch ex As WebException
    
            MessageBox.Show("Unable to access the Web settings service.", _
                "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    
        End Try
    
    End Sub
    
    private void BindWebSettingsTestTextBox()
    {
        try
        {
            this.webSettingsTestTextBox.DataBindings.Add("Text",
                Properties.Settings.Default, "WebSettingsTestText");
        }
        catch (WebException)
        {
            MessageBox.Show("Unable to access the Web settings service.",
                "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }
    

    Notes

    En général, vous utilisez la liaison de données pour activer la communication bidirectionnelle automatique entre un contrôle et un paramètre Web. Toutefois, vous pouvez aussi accéder directement aux paramètres Web comme indiqué dans l'exemple suivant :

    webSettingsTestTextBox.Text = My.Settings.WebSettingsTestText
    
    webSettingsTestTextBox.Text =
        Properties.Settings.Default.WebSettingsTestText;
    
  10. Dans le concepteur, sélectionnez le formulaire, puis dans la fenêtre Propriétés, cliquez sur le bouton Événements.

  11. Sélectionnez l'événement FormClosing, puis appuyez sur ENTRÉE pour générer un gestionnaire d'événements.

  12. Remplacez la méthode générée par le code suivant.

    Le gestionnaire d'événements FormClosing appelle la méthode SaveSettings, qui est également utilisée par les fonctionnalités de déconnexion que vous ajouterez dans la section suivante. La méthode SaveSettings vérifie en premier lieu que l'utilisateur ne s'est pas déconnecté. Pour ce faire, elle contrôle la propriété AuthenticationType du IIdentity retourné par l'entité de sécurité actuelle. L'entité de sécurité actuelle est extraite via la propriété static CurrentPrincipal. Si l'utilisateur a été authentifié pour les services d'application cliente, le type d'authentification sera « ClientForms ». La méthode SaveSettings ne peut pas uniquement vérifier la propriété IIdentity.IsAuthenticated car l'utilisateur peut avoir une identité Windows valide après la déconnexion.

    Si l'utilisateur ne s'est pas déconnecté, la méthode SaveSettings appelle la méthode Save de la classe Settings générée précédemment dans cette procédure. Cette méthode peut lever une WebException si le cookie d'authentification a expiré. Cela se produit uniquement si vous avez sélectionné l'option Imposer aux utilisateurs de se reconnecter chaque fois que le cookie du serveur expire dans la configuration de l'application. Pour plus d'informations, consultez Comment : configurer les services d'application cliente. La méthode SaveSettings gère l'expiration des cookies en appelant ValidateUser pour afficher la boîte de dialogue de connexion. Si l'utilisateur parvient à se connecter, la méthode SaveSettings tente d'enregistrer de nouveau les paramètres en s'appelant elle-même.

    Comme dans le code précédent, la méthode SaveSettings affiche un message d'erreur si le service distant n'est pas disponible. Si le fournisseur de paramètres ne peut pas accéder au service distant, les paramètres sont encore enregistrés dans le cache local et rechargés lorsque l'application redémarre.

    Private Sub Form1_FormClosing(ByVal sender As Object, _
        ByVal e As FormClosingEventArgs) Handles Me.FormClosing
    
        SaveSettings()
    
    End Sub
    
    Private Sub SaveSettings()
    
        ' Return without saving if the authentication type is not
        ' "ClientForms". This indicates that the user is logged out.
        If Not Thread.CurrentPrincipal.Identity.AuthenticationType _
            .Equals("ClientForms") Then Return
    
        Try
    
            My.Settings.Save()
    
        Catch ex As WebException
    
            If ex.Message.Contains("You must log on to call this method.") Then
    
                MessageBox.Show( _
                    "Your login has expired. Please log in again to save " & _
                    "your settings.", "Attempting to save settings...")
    
                Dim isAuthorized As Boolean = False
    
                Try
    
                    ' Call ValidateUser with empty strings in order to 
                    ' display the login dialog box configured as a 
                    ' credentials provider.
                    If Not Membership.ValidateUser( _
                        String.Empty, String.Empty) Then
    
                        MessageBox.Show("Unable to authenticate. " & _
                            "Settings were not saved on the remote service.", _
                            "Not logged in", MessageBoxButtons.OK, _
                            MessageBoxIcon.Error)
    
                    Else
    
                        ' Try again.
                        SaveSettings()
    
                    End If
    
                Catch ex2 As System.Net.WebException
    
                    MessageBox.Show( _
                        "Unable to access the authentication service. " & _
                        "Settings were not saved on the remote service.", _
                        "Not logged in", MessageBoxButtons.OK, _
                        MessageBoxIcon.Warning)
    
                End Try
    
            Else
    
                MessageBox.Show("Unable to access the Web settings service. " & _
                    "Settings were not saved on the remote service.", _
                    "Not logged in", MessageBoxButtons.OK, _
                    MessageBoxIcon.Warning)
    
            End If
    
        End Try
    
    End Sub
    
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        SaveSettings();
    }
    
    private void SaveSettings()
    {
        // Return without saving if the authentication type is not
        // "ClientForms". This indicates that the user is logged out.
        if (!Thread.CurrentPrincipal.Identity.AuthenticationType
          .Equals("ClientForms")) return;
    
        try
        {
            Properties.Settings.Default.Save();
        }
        catch (WebException ex)
        {
            if (ex.Message.Contains("You must log on to call this method."))
            {
                MessageBox.Show(
                    "Your login has expired. Please log in again to save " +
                    "your settings.", "Attempting to save settings...");
    
                try
                {
                    // Call ValidateUser with empty strings in order to 
                    // display the login dialog box configured as a 
                    // credentials provider.
                    if (!Membership.ValidateUser(String.Empty, String.Empty))
                    {
                        MessageBox.Show("Unable to authenticate. " +
                            "Settings were not saved on the remote service.",
                            "Not logged in", MessageBoxButtons.OK, 
                            MessageBoxIcon.Error);
                    }
                    else
                    {
                        // Try again.
                        SaveSettings();
                    }
                }
                catch (System.Net.WebException)
                {
                    MessageBox.Show(
                        "Unable to access the authentication service. " +
                        "Settings were not saved on the remote service.",
                        "Not logged in", MessageBoxButtons.OK, 
                        MessageBoxIcon.Warning);
                }
            }
            else
            {
                MessageBox.Show("Unable to access the Web settings service. " +
                    "Settings were not saved on the remote service.", 
                    "Not logged in", MessageBoxButtons.OK, 
                    MessageBoxIcon.Warning);
            }
        }
    }
    
  13. Ajoutez la méthode suivante à la fin de la classe Form1.

    Ce code gère l'événement ClientSettingsProvider.SettingsSaved et affiche un avertissement si l'un des paramètres n'a pas pu être enregistré. L'événement SettingsSaved ne se produit pas si le service de paramètres n'est pas disponible ou si le cookie d'authentification a expiré. L'événement SettingsSaved se produit par exemple si l'utilisateur s'est déjà déconnecté. Vous pouvez tester ce gestionnaire d'événements en ajoutant directement du code de déconnexion à la méthode SaveSettings avant l'appel de la méthode Save. Le code de déconnexion que vous pouvez utiliser est décrit dans la section suivante.

    Private WithEvents settingsProvider As ClientSettingsProvider = My.Settings _
        .Providers("System.Web.ClientServices.Providers.ClientSettingsProvider")
    
    Private Sub Form1_SettingsSaved(ByVal sender As Object, _
        ByVal e As SettingsSavedEventArgs) _
        Handles settingsProvider.SettingsSaved
    
        ' If any settings were not saved, display a list of them.
        If e.FailedSettingsList.Count > 0 Then
    
            Dim failedSettings As String = String.Join( _
                Environment.NewLine, e.FailedSettingsList.ToArray())
    
            Dim message As String = String.Format("{0}{1}{1}{2}", _
                "The following setting(s) were not saved:", _
                Environment.NewLine, failedSettings)
    
            MessageBox.Show(message, "Unable to save settings", _
                MessageBoxButtons.OK, MessageBoxIcon.Warning)
    
        End If
    
    End Sub
    
    private void Form1_SettingsSaved(object sender,
        SettingsSavedEventArgs e)
    {
        // If any settings were not saved, display a list of them.
        if (e.FailedSettingsList.Count > 0)
        {
            String failedSettings = String.Join(
                Environment.NewLine,
                e.FailedSettingsList.ToArray());
    
            String message = String.Format("{0}{1}{1}{2}",
                "The following setting(s) were not saved:",
                Environment.NewLine, failedSettings);
    
            MessageBox.Show(message, "Unable to save settings",
                MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
    }
    
  14. Pour C#, ajoutez le code suivant à la fin de la méthode Form1_Load. Ce code associe la méthode que vous avez ajoutée dans la dernière étape à l'événement SettingsSaved.

    ((ClientSettingsProvider)Properties.Settings.Default.Providers
        ["System.Web.ClientServices.Providers.ClientSettingsProvider"])
        .SettingsSaved += 
        new EventHandler<SettingsSavedEventArgs>(Form1_SettingsSaved);
    

Pour tester l'application à ce stade, exécutez-la plusieurs fois en tant qu'employé et gestionnaire, et tapez des valeurs différentes dans la zone de texte. Les valeurs sont conservées d'une session à l'autre sur une base individuelle.

Implémentation de la déconnexion

Lorsque l'utilisateur active la case à cocher Mémoriser mes informations au moment de la connexion, l'application authentifie automatiquement l'utilisateur lors des exécutions suivantes. L'authentification automatique continue ensuite pendant que l'application est en mode hors connexion ou jusqu'à ce que le cookie d'authentification expire. Toutefois, il peut arriver que plusieurs utilisateurs aient besoin d'accéder à l'application ou qu'un seul utilisateur se connecte avec des informations d'identification différentes. Pour permettre ce scénario, vous devez implémenter la fonctionnalité de déconnexion, comme décrit dans la procédure suivante.

Pour implémenter la fonctionnalité de déconnexion

  1. Dans le concepteur Form1, ajoutez un contrôle Button au formulaire à partir de la Boîte à outils.

  2. Dans la fenêtre Propriétés, spécifiez la valeur (Nom) de logoutButton et la valeur Texte de &Log Out.

  3. Double-cliquez sur logoutButton pour générer un gestionnaire d'événements Click.

    L'éditeur de code apparaît avec le curseur dans la méthode logoutButton_Click.

  4. Remplacez la méthode générée logoutButton_Click par le code suivant.

    Ce gestionnaire d'événements appelle d'abord la méthode SaveSettings que vous avez ajoutée dans la section précédente. Il appelle ensuite la méthode ClientFormsAuthenticationMembershipProvider.Logout. Si le service d'authentification n'est pas disponible, la méthode Logout lève une WebException. Dans ce cas, la méthode logoutButton_Click affiche un message d'avertissement et passe temporairement en mode hors connexion pour déconnecter l'utilisateur. Le mode hors connexion est décrit dans la section suivante.

    La déconnexion supprime le cookie d'authentification local afin que la connexion soit requise lorsque l'application est redémarrée. Après la déconnexion, le gestionnaire d'événements redémarre l'application. Lorsque celle-ci redémarre, elle affiche le message d'accueil, puis la boîte de dialogue de connexion. Le message d'accueil indique que l'application a redémarré. Cela empêche toute confusion potentielle si l'utilisateur doit se connecter pour enregistrer des paramètres, puis se connecter de nouveau car l'application a redémarré.

    Private Sub logoutButton_Click(ByVal sender As Object, _
        ByVal e As EventArgs) Handles logoutButton.Click
    
        SaveSettings()
    
        Dim authProvider As ClientFormsAuthenticationMembershipProvider = _
            CType(System.Web.Security.Membership.Provider,  _
            ClientFormsAuthenticationMembershipProvider)
    
        Try
    
            authProvider.Logout()
    
        Catch ex As WebException
    
            MessageBox.Show("Unable to access the authentication service." & _
                Environment.NewLine & "Logging off locally only.", _
                "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            ConnectivityStatus.IsOffline = True
            authProvider.Logout()
            ConnectivityStatus.IsOffline = False
    
        End Try
    
        Application.Restart()
    
    End Sub
    
    private void logoutButton_Click(object sender, EventArgs e)
    {
        SaveSettings();
    
        ClientFormsAuthenticationMembershipProvider authProvider =
            (ClientFormsAuthenticationMembershipProvider)
            System.Web.Security.Membership.Provider;
    
        try
        {
            authProvider.Logout();
        }
        catch (WebException ex)
        {
            MessageBox.Show("Unable to access the authentication service." +
                Environment.NewLine + "Logging off locally only.",
                "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            ConnectivityStatus.IsOffline = true;
            authProvider.Logout();
            ConnectivityStatus.IsOffline = false;
        }
    
        Application.Restart();
    }
    

Pour tester la fonctionnalité de déconnexion, exécutez l'application et sélectionnez Mémoriser mes informations dans la boîte de dialogue Connexion. Ensuite, fermez et redémarrez l'application pour vérifier que vous n'avez plus à vous connecter. Enfin, redémarrez l'application en cliquant sur Se déconnecter.

Activation du mode hors connexion

Dans la procédure suivante, vous ajoutez une case à cocher au formulaire pour permettre à l'utilisateur de passer en mode hors connexion. Votre application indique le mode hors connexion en affectant à la propriété static ConnectivityStatus.IsOffline la valeur true. L'état hors connexion est stocké sur le disque dur local à l'emplacement indiqué par la propriété Application.UserAppDataPath. Cela signifie que l'état hors connexion est stocké sur une base individuelle, pour chaque application.

En mode hors connexion, toutes les requêtes de service d'application cliente extraient des données du cache local au lieu de tenter d'accéder aux services. Dans la configuration par défaut, les données locales incluent une forme chiffrée du mot de passe de l'utilisateur. Cela permet à l'utilisateur de se connecter pendant que l'application est en mode hors connexion. Pour plus d'informations, consultez Comment : configurer les services d'application cliente.

Pour activer le mode hors connexion dans votre application

  1. Dans l'Explorateur de solutions, sélectionnez Form1 dans le projet ClientAppServicesDemo, puis sélectionnez Afficher | Concepteur dans le menu principal de Visual Studio.

  2. Dans le concepteur, ajoutez un contrôle CheckBox au formulaire.

  3. Dans la fenêtre Propriétés, spécifiez la valeur (Nom) de workOfflineCheckBox et la valeur Texte de &Work offline.

  4. Dans la fenêtre Propriétés, cliquez sur le bouton Événements.

  5. Sélectionnez l'événement CheckedChanged, puis appuyez sur ENTRÉE pour générer un gestionnaire d'événements.

  6. Remplacez la méthode générée par le code suivant.

    Ce code met à jour la valeur IsOffline et revalide silencieusement l'utilisateur lors du passage en mode en ligne. La méthode ClientFormsIdentity.RevalidateUser utilise les informations d'identification mises en cache pour que l'utilisateur n'ait pas explicitement à se connecter. Si le service d'authentification n'est pas disponible, un message d'avertissement s'affiche et l'application reste hors connexion.

    Notes

    La méthode RevalidateUser est fournie pour des raisons pratiques uniquement. Étant donné qu'elle n'a pas de valeur de retour, elle ne peut pas indiquer si la revalidation a échoué. Par exemple, la revalidation peut échouer si les informations d'identification de l'utilisateur ont été modifiées sur le serveur. Dans ce cas, vous souhaitez peut-être inclure du code qui valide explicitement les utilisateurs après l'échec d'un appel de service. Pour plus d'informations, consultez la section Accès aux paramètres Web plus haut dans cette procédure pas à pas.

    Après la revalidation, ce code enregistre toutes les modifications apportées aux paramètres Web locaux en appelant la méthode SaveSettings que vous avez ajoutée précédemment. Il extrait ensuite toutes les nouvelles valeurs sur le serveur en appelant la méthode Reload de la classe Settings du projet (accessible en tant que Properties.Settings.Default en C# et My.Settings en Visual Basic).

    Private Sub workOfflineCheckBox_CheckedChanged( _
        ByVal sender As Object, ByVal e As EventArgs) _
        Handles workOfflineCheckBox.CheckedChanged
    
        ConnectivityStatus.IsOffline = workOfflineCheckBox.Checked
    
        If Not ConnectivityStatus.IsOffline Then
    
            Try
    
                ' Silently re-validate the user.
                CType(System.Threading.Thread.CurrentPrincipal.Identity,  _
                    ClientFormsIdentity).RevalidateUser()
    
                ' If any settings have been changed locally, save the new
                ' new values to the Web settings service.
                SaveSettings()
    
                ' If any settings have not been changed locally, check 
                ' the Web settings service for updates. 
                My.Settings.Reload()
    
            Catch ex As WebException
    
                MessageBox.Show( _
                    "Unable to access the authentication service. " & _
                    Environment.NewLine + "Staying in offline mode.", _
                    "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                workOfflineCheckBox.Checked = True
    
            End Try
    
        End If
    
    End Sub
    
    private void workOfflineCheckBox_CheckedChanged(
        object sender, EventArgs e)
    {
        ConnectivityStatus.IsOffline = workOfflineCheckBox.Checked;
        if (!ConnectivityStatus.IsOffline)
        {
            try
            {
                // Silently re-validate the user.
                ((ClientFormsIdentity)
                    System.Threading.Thread.CurrentPrincipal.Identity)
                    .RevalidateUser();
    
                // If any settings have been changed locally, save the new
                // new values to the Web settings service.
                SaveSettings();
    
                // If any settings have not been changed locally, check 
                // the Web settings service for updates. 
                Properties.Settings.Default.Reload();
            }
            catch (WebException)
            {
                MessageBox.Show(
                    "Unable to access the authentication service. " +
                    Environment.NewLine + "Staying in offline mode.",
                    "Warning", MessageBoxButtons.OK,
                    MessageBoxIcon.Warning);
                workOfflineCheckBox.Checked = true;
            }
        }
    }
    
  7. Ajoutez le code suivant à la fin de la méthode Form1_Load pour garantir que la case à cocher affiche l'état de connexion en cours.

    workOfflineCheckBox.Checked = ConnectivityStatus.IsOffline
    
    workOfflineCheckBox.Checked = ConnectivityStatus.IsOffline;
    

Cela termine l'exemple d'application. Pour tester la fonction hors connexion, exécutez l'application, connectez-vous comme employé ou gestionnaire, puis sélectionnez Travailler hors connexion. Modifiez la valeur de la zone de texte, puis fermez l'application. Redémarrez-la. Avant de vous connecter, cliquez avec le bouton droit sur l'icône Serveur de développement ASP.NET dans la zone de notification de la barre des tâches, puis cliquez sur Arrêt. Ensuite, connectez-vous normalement. Même si le serveur n'est pas en cours d'exécution, vous pouvez toujours vous connecter. Changez la valeur de la zone de texte, quittez l'application et redémarrez pour vérifier le changement de valeur.

Résumé

Dans cette procédure pas à pas, vous avez appris à activer et utiliser les services d'application cliente dans une application Windows Forms. Après avoir configuré un serveur de test, vous avez ajouté le code à votre application pour authentifier les utilisateurs et extraire du serveur des rôles d'utilisateur ainsi que des paramètres d'application. Vous avez également appris à activer le mode hors connexion pour que votre application utilise un cache de données local au lieu des services distants lorsque la connectivité n'est pas disponible.

Étapes suivantes

Dans une application réelle, vous accédez aux données de nombreux utilisateurs à partir d'un serveur distant qui n'est pas toujours disponible ou peut tomber en panne sans prévenir. Pour rendre votre application fiable, vous devez gérer de manière appropriée les situations dans lesquelles le service n'est pas disponible. Cette procédure pas à pas inclut des blocs try/catch pour intercepter une WebException et afficher un message d'erreur lorsque le service n'est pas disponible. Dans le code de production, vous souhaitez peut-être gérer ce cas en basculant en mode hors connexion, en quittant l'application ou en refusant l'accès à des fonctionnalités spécifiques.

Pour augmenter la sécurité de votre application, veillez à tester entièrement l'application et le serveur avant tout déploiement.

Voir aussi

Tâches

Comment : configurer les services d'application cliente

Procédure pas à pas : utilisation de services d'application ASP.NET

Concepts

Vue d'ensemble des services d'application cliente

Autres ressources

Services d'application cliente

Outil Administration de site Web ASP.NET

Création et configuration de la base de données des services d'application pour SQL Server