Gewusst wie: Aktivieren von Authentifizierung in RIA Services
In diesem Thema wird erläutert, wie die Benutzerauthentifizierung in der Anwendung mit WCF RIA Services aktiviert wird. Es enthält den Code, den Sie dem Serverprojekt und dem Clientprojekt hinzufügen müssen, um die Authentifizierung als Dienst für die Clientanwendung verfügbar zu machen. Sie können den Zugriff auf einen Domänenvorgang auf authentifizierte Benutzer beschränken, indem Sie dem Domänenvorgang das RequiresAuthenticationAttribute-Attribut hinzufügen.
Die Authentifizierung in WCF RIA Services beruht auf dem Authentifizierungsframework in ASP.NET. Weitere Informationen zur ASP.NET-Authentifizierung finden Sie unter Einführung in die Mitgliedschaft.
So konfigurieren Sie das Serverprojekt
Öffnen Sie im Serverprojekt die Datei "Web.config".
Fügen Sie im
<system.web>
-Element ein<authentication>
-Element hinzu.Legen Sie die
mode
-Eigenschaft auf den Authentifizierungsmodus fest, den Sie im Projekt verwenden.Im folgenden Code ist
mode
für das<authentication>
-Element aufForms
festgelegt. Legen Sie diemode
-Eigenschaft zur Verwendung der Windows-Authentifizierung aufWindows
fest. Ihre Datei "Web.config" enthält andere Elemente.<system.web> <authentication mode="Forms"></authentication> </system.web>
Speichern Sie die Datei "Web.config".
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Serverprojekt, wählen Sie Hinzufügen aus und dann Neues Element.
Das Dialogfeld Neues Element hinzufügen wird angezeigt.
Wählen Sie die Vorlage Domänendienst zur Authentifizierung aus, und geben Sie einen Namen für den Dienst an.
Klicken Sie auf Hinzufügen.
Wenn Sie den Zugriff auf einen Domänenvorgang auf authentifizierte Benutzer beschränken möchten, wenden Sie das RequiresAuthenticationAttribute-Attribut auf den Domänenvorgang an.
Im folgenden Beispiel können nur authentifizierte Benutzer auf die
GetSalesOrderHeaders
-Methode zugreifen.<RequiresAuthentication()> _ Public Function GetSalesOrderHeaders() As IQueryable(Of SalesOrderHeader) Return Me.ObjectContext.SalesOrderHeaders End Function
[RequiresAuthentication()] public IQueryable<SalesOrderHeader> GetSalesOrderHeaders() { return this.ObjectContext.SalesOrderHeaders; }
Erstellen Sie die Projektmappe.
So konfigurieren Sie den Authentifizierungsdienst im Clientprojekt
Öffnen Sie im Clientprojekt die CodeBehind-Datei für die Datei "App.xaml" ("App.xaml.cs" bzw. "App.xaml.vb").
Erstellen Sie im Konstruktor eine Instanz der WebContext-Klasse.
Legen Sie die Authentication-Eigenschaft auf den Authentifizierungstyp fest, den Sie im Serverprojekt konfiguriert haben, und fügen Sie die WebContext-Instanz ApplicationLifetimeObjects hinzu.
Das folgende Beispiel zeigt, wie die Authentifizierung auf FormsAuthentication festgelegt wird.
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); }
Wenn Sie die Windows-Authentifizierung verwenden oder einen Benutzer mit persistenten Anmeldeinformationen laden möchten, rufen Sie die LoadUser-Methode auf, bevor der Benutzer die Möglichkeit erhält, sich anzumelden.
Das folgende Beispiel zeigt, wie die LoadUser-Methode von der
Application_Startup
-Methode aufgerufen wird.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 }
Fügen Sie dem Clientprojekt ggf. eine Seite zum Sammeln von Benutzeranmeldeinformationen hinzu.
Rufen Sie in der CodeBehind-Datei für die Anmeldeseite die Login-Methode auf, um Benutzer anzumelden.
Das folgende Beispiel zeigt, wie die Login-Methode von einem Ereignishandler für eine Anmeldeschaltfläche aufgerufen wird. Um auf die Ergebnisse des Anmeldevorgangs zu reagieren, wird eine Rückrufmethode hinzugefügt.
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; }
Rufen Sie zum Abmelden von Benutzern die Logout-Methode auf.
Das folgende Beispiel zeigt, wie die Logout-Methode von einem Ereignishandler für eine Abmeldeschaltfläche aufgerufen wird. Um auf die Ergebnisse des Abmeldevorgangs zu reagieren, wird eine Rückrufmethode hinzugefügt.
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(); } }
Rufen Sie die IsAuthenticated-Eigenschaft der generierten User-Entität ab, um zu überprüfen, ob ein Benutzer authentifiziert ist.
Im folgenden Beispiel wird vor dem Abrufen einer Profileigenschaft und Aufrufen eines Domänenvorgangs überprüft, ob der aktuelle Benutzer authentifiziert ist.
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; }
Wenn Sie das WebContext-Objekt in XAML verfügbar machen möchten, fügen Sie die aktuelle WebContext-Instanz vor dem Erstellen des visuellen Objekts im Stamm den Anwendungsressourcen im Application.Startup-Ereignis hinzu.
Das folgende Beispiel zeigt, wie die WebContext-Instanz als Anwendungsressource hinzugefügt wird.
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(); }
Siehe auch
Aufgaben
Exemplarische Vorgehensweise: Verwenden des Authentifizierungsdiensts mit der Silverlight-Navigationsanwendung
Exemplarische Vorgehensweise: Verwenden des Authentifizierungsdiensts mit der Silverlight-Geschäftsanwendung