Procédure : Activer le service d'authentification des Services RIA

Cette rubrique montre comment activer l'authentification utilisateur dans votre application à l'aide des Services RIA WCF. Elle montre le code que vous devez ajouter à la fois au projet serveur et au projet client pour rendre l'authentification disponible sous forme de service à l'application cliente. Vous pouvez limiter l'accès à une opération de domaine aux seuls utilisateurs authentifiés en appliquant l'attribut RequiresAuthenticationAttribute à l'opération de domaine.

L'authentification dans les Services RIA WCF repose sur l'infrastructure d'authentification dans ASP.NET. Pour plus d'informations sur l'authentification ASP.NET, consultez Introduction à l'appartenance (membership)

Pour configurer le projet serveur

  1. Dans le projet serveur, ouvrez le fichier Web.config.

  2. Dans l'élément <system.web>, ajoutez un élément <authentication>.

  3. Affectez à la propriété mode le mode d'authentification que vous utiliserez dans le projet.

    Le code suivant montre l'élément <authentication> dont le mode a la valeur Forms. Affectez à la propriété mode la valeur Windows pour utiliser l'authentification Windows. Votre fichier Web.config contiendra d'autres éléments.

    <system.web>
      <authentication mode="Forms"></authentication>
    </system.web>
    
  4. Enregistrez le fichier Web.config.

  5. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le projet serveur, sélectionnez Ajouter, puis Nouvel élément.

    La boîte de dialogue Ajouter un nouvel élément s'affiche.

  6. Sélectionnez le modèle DomainService d'authentification et spécifiez un nom pour le service.

    RIA_ServicesAddAuth

  7. Cliquez sur Ajouter.

  8. Pour limiter l'accès à une opération de domaine aux seuls utilisateurs authentifiés, appliquez l'attribut RequiresAuthenticationAttribute à l'opération de domaine.

    L'exemple suivant spécifie que seuls les utilisateurs authentifiés peuvent accéder à la méthode GetSalesOrderHeaders.

    <RequiresAuthentication()> _
    Public Function GetSalesOrderHeaders() As IQueryable(Of SalesOrderHeader)
        Return Me.ObjectContext.SalesOrderHeaders
    End Function
    
    [RequiresAuthentication()]
    public IQueryable<SalesOrderHeader> GetSalesOrderHeaders()
    {
        return this.ObjectContext.SalesOrderHeaders;
    }
    
  9. Générez la solution.

Pour configurer le service d'authentification sur le projet client

  1. Dans le projet client, ouvrez le fichier code-behind du fichier App.xaml (App.xaml.cs ou App.xaml.vb).

  2. Dans le constructeur, créez une instance de la classe WebContext.

  3. Affectez à la propriété Authentication le type d'authentification que vous avez configuré dans le projet serveur et ajoutez l'instance de WebContext à l' ApplicationLifetimeObjects.

    L'exemple suivant indique comment définir l'authentification sur FormsAuthentication.

    Public Sub New()
        InitializeComponent()
    
        Dim webcontext As New WebContext
        webcontext.Authentication = New System.ServiceModel.DomainServices.Client.ApplicationServices.FormsAuthentication
        Me.ApplicationLifetimeObjects.Add(webcontext)
    End Sub
    
    public App()
    {
        this.Startup += this.Application_Startup;
        this.UnhandledException += this.Application_UnhandledException;
    
        InitializeComponent();
    
        WebContext webcontext = new WebContext();
        webcontext.Authentication = new System.ServiceModel.DomainServices.Client.ApplicationServices.FormsAuthentication();
        this.ApplicationLifetimeObjects.Add(webcontext);
    }
    
  4. Si vous utilisez l'authentification Windows ou si vous voulez charger un utilisateur qui possède des informations d'identification persistantes, appelez la méthode LoadUser avant de donner à l'utilisateur la possibilité de se connecter.

    L'exemple suivant montre comment appeler la méthode LoadUser à partir de la méthode Application_Startup.

    Private Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) Handles Me.Startup
        WebContext.Current.Authentication.LoadUser(AddressOf OnLoadUser_Completed, Nothing)
        Me.RootVisual = New MainPage()
    End Sub
    
    Private Sub OnLoadUser_Completed(ByVal operation As LoadUserOperation)
        ' Update UI, if necessary
    End Sub
    
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        WebContext.Current.Authentication.LoadUser(OnLoadUser_Completed, null);
        this.RootVisual = new MainPage();
    }
    
    private void OnLoadUser_Completed(LoadUserOperation operation)
    {
        // update UI, if necessary
    }
    
  5. Si nécessaire, ajoutez une page au projet client pour recueillir les informations d'identification de l'utilisateur.

  6. Dans le fichier code-behind de la page de connexion, appelez la méthode Login pour connecter les utilisateurs.

    L'exemple suivant indique comment appeler la méthode Login à partir d'un gestionnaire d'événements pour un bouton de connexion. Une méthode de rappel est incluse pour répondre aux résultats de l'opération de connexion.

    Private Sub LoginButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Dim lp As LoginParameters = New LoginParameters(UserName.Text, Password.Password)
        WebContext.Current.Authentication.Login(lp, AddressOf Me.LoginOperation_Completed, Nothing)
        LoginButton.IsEnabled = False
        LoginResult.Text = ""
    End Sub
    
    Private Sub LoginOperation_Completed(ByVal lo As LoginOperation)
        If (lo.HasError) Then
            LoginResult.Text = lo.Error.Message
            LoginResult.Visibility = System.Windows.Visibility.Visible
            lo.MarkErrorAsHandled()
        ElseIf (lo.LoginSuccess = False) Then
            LoginResult.Text = "Login failed. Please check user name and password."
            LoginResult.Visibility = System.Windows.Visibility.Visible
        ElseIf (lo.LoginSuccess = True) Then
            SetControlVisibility(True)
        End If
        LoginButton.IsEnabled = True
    End Sub
    
    private void LoginButton_Click(object sender, RoutedEventArgs e)
    {
        LoginParameters lp = new LoginParameters(UserName.Text, Password.Password);
        WebContext.Current.Authentication.Login(lp, this.LoginOperation_Completed, null);
        LoginButton.IsEnabled = false;
        LoginResult.Text = "";
    }
    
    private void LoginOperation_Completed(LoginOperation lo)
    {
        if (lo.HasError)
        {
            LoginResult.Text = lo.Error.Message;
            LoginResult.Visibility = System.Windows.Visibility.Visible;
            lo.MarkErrorAsHandled();
        }
        else if (lo.LoginSuccess == false)
        {
            LoginResult.Text = "Login failed. Please check user name and password.";
            LoginResult.Visibility = System.Windows.Visibility.Visible;
        }
        else if (lo.LoginSuccess == true)
        {
            SetControlVisibility(true);
        }
        LoginButton.IsEnabled = true;
    }
    
  7. Pour déconnecter les utilisateurs, appelez la méthode Logout.

    L'exemple suivant indique comment appeler la méthode Logout à partir d'un gestionnaire d'événements pour un bouton de déconnexion. Une méthode de rappel est incluse pour répondre aux résultats de l'opération de déconnexion.

    Private Sub LogoutButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
        WebContext.Current.Authentication.Logout(AddressOf Me.LogoutOperation_Completed, Nothing)
    End Sub
    
    Private Sub LogoutOperation_Completed(ByVal lo As LogoutOperation)
        If (Not (lo.HasError)) Then
            SetControlVisibility(False)
        Else
            Dim ew As ErrorWindow = New ErrorWindow("Logout failed.", "Please try logging out again.")
            ew.Show()
            lo.MarkErrorAsHandled()
        End If
    End Sub
    
    private void LogoutButton_Click(object sender, RoutedEventArgs e)
    {
        WebContext.Current.Authentication.Logout(this.LogoutOperation_Completed, null);
    }
    
    private void LogoutOperation_Completed(LogoutOperation lo)
    {
    
        if (!lo.HasError)
        {
            SetControlVisibility(false);
        }
        else
        {
            ErrorWindow ew = new ErrorWindow("Logout failed.", "Please try logging out again.");
            ew.Show();
            lo.MarkErrorAsHandled();
        }
    }
    
  8. Pour vérifier si un utilisateur est authentifié, récupérez la propriété IsAuthenticated sur l'entité User générée.

    L'exemple suivant vérifie si l'utilisateur actuel est authentifié avant de récupérer une propriété de profil et d'appeler une opération de domaine.

    Private Sub LoadReports()
        If (WebContext.Current.User.IsAuthenticated) Then
            numberOfRows = WebContext.Current.User.DefaultRows
            AddHandler WebContext.Current.User.PropertyChanged, AddressOf User_PropertyChanged
            LoadRestrictedReports()
        Else
            CustomersGrid.Visibility = System.Windows.Visibility.Collapsed
            SalesOrdersGrid.Visibility = System.Windows.Visibility.Collapsed
        End If
    
        Dim loadProducts = context.Load(context.GetProductsQuery().Take(numberOfRows))
        ProductsGrid.ItemsSource = loadProducts.Entities
    End Sub
    
    private void LoadReports()
    {
        if (WebContext.Current.User.IsAuthenticated)
        {
            numberOfRows = WebContext.Current.User.DefaultRows;
            WebContext.Current.User.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(User_PropertyChanged);
            LoadRestrictedReports();
        }
        else
        {
            CustomersGrid.Visibility = System.Windows.Visibility.Collapsed;
            SalesOrdersGrid.Visibility = System.Windows.Visibility.Collapsed;
        }
    
        LoadOperation<Product> loadProducts = context.Load(context.GetProductsQuery().Take(numberOfRows));
        ProductsGrid.ItemsSource = loadProducts.Entities;
    }
    
  9. Si vous voulez rendre l'objet WebContext disponible dans XAML, ajoutez l'instance WebContext actuelle aux ressources de l'application dans l'événement Application.Startup avant de créer le visuel racine.

    L'exemple suivant montre comment ajouter l'instance WebContext comme une ressource d'application.

    Private Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) Handles Me.Startup
        Me.Resources.Add("WebContext", WebContext.Current)
        Me.RootVisual = New MainPage()
    End Sub
    
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        this.Resources.Add("WebContext", WebContext.Current);
        this.RootVisual = new MainPage();
    }
    

Voir aussi

Tâches

Procédure pas à pas : Utilisation du service d'authentification avec une application de navigation Silverlight
Procédure pas à pas : Utilisation du service d'authentification avec une application métier Silverlight