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
Dans le projet serveur, ouvrez le fichier Web.config.
Dans l'élément
<system.web>
, ajoutez un élément<authentication>
.Affectez à la propriété
mode
le mode d'authentification que vous utiliserez dans le projet.Le code suivant montre l'élément
<authentication>
dont lemode
a la valeurForms
. Affectez à la propriétémode
la valeurWindows
pour utiliser l'authentification Windows. Votre fichier Web.config contiendra d'autres éléments.<system.web> <authentication mode="Forms"></authentication> </system.web>
Enregistrez le fichier Web.config.
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.
Sélectionnez le modèle DomainService d'authentification et spécifiez un nom pour le service.
Cliquez sur Ajouter.
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; }
Générez la solution.
Pour configurer le service d'authentification sur le projet client
Dans le projet client, ouvrez le fichier code-behind du fichier App.xaml (App.xaml.cs ou App.xaml.vb).
Dans le constructeur, créez une instance de la classe WebContext.
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); }
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 }
Si nécessaire, ajoutez une page au projet client pour recueillir les informations d'identification de l'utilisateur.
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; }
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(); } }
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; }
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