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

  1. Öffnen Sie im Serverprojekt die Datei "Web.config".

  2. Fügen Sie im <system.web>-Element ein <authentication>-Element hinzu.

  3. Legen Sie die mode-Eigenschaft auf den Authentifizierungsmodus fest, den Sie im Projekt verwenden.

    Im folgenden Code ist mode für das <authentication>-Element auf Forms festgelegt. Legen Sie die mode-Eigenschaft zur Verwendung der Windows-Authentifizierung auf Windows fest. Ihre Datei "Web.config" enthält andere Elemente.

    <system.web>
      <authentication mode="Forms"></authentication>
    </system.web>
    
  4. Speichern Sie die Datei "Web.config".

  5. 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.

  6. Wählen Sie die Vorlage Domänendienst zur Authentifizierung aus, und geben Sie einen Namen für den Dienst an.

    RIA_ServicesAddAuth

  7. Klicken Sie auf Hinzufügen.

  8. 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;
    }
    
  9. Erstellen Sie die Projektmappe.

So konfigurieren Sie den Authentifizierungsdienst im Clientprojekt

  1. Öffnen Sie im Clientprojekt die CodeBehind-Datei für die Datei "App.xaml" ("App.xaml.cs" bzw. "App.xaml.vb").

  2. Erstellen Sie im Konstruktor eine Instanz der WebContext-Klasse.

  3. 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);
    }
    
  4. 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
    }
    
  5. Fügen Sie dem Clientprojekt ggf. eine Seite zum Sammeln von Benutzeranmeldeinformationen hinzu.

  6. 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;
    }
    
  7. 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();
        }
    }
    
  8. 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;
    }
    
  9. 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