Authentifizierung, Rollen und Profile

Wenn Sie im Clientprojekt die Anmeldeinformationen eines Benutzers überprüfen, den Zugriff auf bestimmte Vorgänge einschränken oder Eigenschaften für jeden Benutzer beibehalten möchten, fügen Sie der WCF RIA Services-Projektmappe den Authentifizierungsdomänendienst hinzu. In einer herkömmlichen ASP.NET-Webanwendung können Sie diese Funktionen mithilfe des ASP.NET-Mitgliedschaftsframeworks ausführen. RIA Services baut auf dem ASP.NET-Mitgliedschaftsframework auf und macht es anhand des Authentifizierungsdomänendiensts für Internetclients mit umfassenden Funktionen verfügbar. Nachdem Sie einen Authentifizierungsdomänendienst hinzugefügt haben, können Sie die folgenden Funktionen aktivieren:

  • Authentifizierung – zum Überprüfen der Anmeldeinformationen eines Benutzers und Markieren des Benutzers als an- oder abgemeldet

  • Rollen – zum Gruppieren von Benutzern nach Zuständigkeiten und Gewähren von Ressourcenberechtigungen für authentifizierte Mitglieder einer Gruppe

  • Profile – zum Beibehalten von Eigenschaften für authentifizierte Benutzer und Abrufen dieser Eigenschaften in der Anwendung

Dieses Thema bietet eine Einführung in die Verwendung von Authentifizierung, Rollen und Profilen in einer RIA Services-Projektmappe.

Domänendienst zur Authentifizierung

Die Vorlage "Domänendienst zur Authentifizierung" von RIA Services ermöglicht den Zugriff auf Authentifizierung, Rollen und Profile auf der Präsentationsebene. Um einen Domänendienst zur Authentifizierung zu erstellen, erstellen Sie einfach im Serverprojekt ein neues Element und wählen beim Erstellen des Elements die Vorlage "Domänendienst zur Authentifizierung" aus.

RIA_ServicesAddAuth

Wenn Sie einen Domänendienst zur Authentifizierung hinzufügen, fügt das RIA Services-Framework dem Serverprojekt automatisch zwei Klassen hinzu. Die Klasse, die den Authentifizierungsdienst darstellt, ist von der AuthenticationBase-Klasse abgeleitet. Die Klasse, die den Benutzer darstellt, ist von der UserBase-Klasse abgeleitet. Die Benutzerklasse enthält die Profileigenschaften für einen authentifizierten Benutzer.

Wenn Sie die Projektmappe erstellen, generiert RIA Services automatisch im Clientprojekt eine WebContext-Klasse. Die WebContext-Klasse ermöglicht es Ihnen, im Clientprojekt auf den Domänendienst zur Authentifizierung und den Benutzer zuzugreifen. Die Current-Eigenschaft wird verwendet, um die aktuelle WebContext-Instanz abzurufen. Die WebContext-Klasse ist von WebContextBase abgeleitet.

Ein Beispiel zum Hinzufügen eines Domänendiensts zur Authentifizierung zu einer RIA Services-Projektmappe finden Sie unter Exemplarische Vorgehensweise: Verwenden des Authentifizierungsdiensts mit der Silverlight-Navigationsanwendung.

Silverlight-Geschäftsanwendung und Authentifizierung

Wenn Sie die Vorlage "Silverlight-Geschäftsanwendung" zum Erstellen einer Projektmappe auswählen, enthält die Projektmappe automatisch einen Domänendienst zur Authentifizierung und Steuerelemente zum Verwalten der Anmeldung und Registrierung von Benutzern. Standardmäßig wird für die Projektmappe die Formularauthentifizierung verwendet, Sie können sie jedoch leicht für die Windows-Authentifizierung konfigurieren. Rollen sind aktiviert, und eine Profileigenschaft ist definiert. Ein Beispiel für die standardmäßig in einer Silverlight-Geschäftsanwendung enthaltenen Authentifizierungsfunktionen und zum Ändern der Konfiguration von der Formularauthentifizierung in die Windows-Authentifizierung finden Sie unter Exemplarische Vorgehensweise: Verwenden der Silverlight-Geschäftsanwendungsvorlage. Ein Beispiel zur Verwendung der Standardfunktionen in einer Silverlight-Geschäftsanwendung finden Sie unter Exemplarische Vorgehensweise: Verwenden des Authentifizierungsdiensts mit der Silverlight-Geschäftsanwendung.

Die folgende Abbildung zeigt das Registrierungsfenster, eine der Standardfunktionen in der Silverlight-Geschäftsanwendung.

Dialogfeld "Registrieren"

Authentifizierung

RIA Services stellt Klassen bereit, mit denen Sie die Formularauthentifizierung oder Windows-Authentifizierung mühelos in der Projektmappe implementieren können. Wenn Sie die Authentifizierung in der RIA Services-Projektmappe verwenden möchten, müssen Sie das Serverprojekt und das Clientprojekt für die Authentifizierung konfigurieren. Weitere Informationen finden Sie unter Gewusst wie: Aktivieren von Authentifizierung in RIA Services.

Nachdem Sie die Server- und Clientprojekte konfiguriert haben, melden Sie Benutzer in der Silverlight-Anwendung asynchron an, indem Sie die Login-Methode des WebContext-Objekts aufrufen. Wenn Sie die Windows-Authentifizierung verwenden oder einen Benutzer mit persistenten Anmeldeinformationen abrufen, müssen Sie die Login-Methode nicht aufrufen. Stattdessen rufen Sie die LoadUser-Methode auf, um den mittels Windows-Authentifizierung authentifizierten Benutzer abzurufen oder einen Benutzer mit persistenten Anmeldeinformationen zu laden.

Die folgenden Methoden und Eigenschaften werden normalerweise im Clientprojekt verwendet, wenn Sie die Authentifizierung implementiert haben.

Member Zu verwendender Code Aufgabe

Authentication

WebContext.Current.Authentication

Zugreifen auf den Authentifizierungsdienst

User

WebContext.Current.User

Zugreifen auf das Objekt, das den Zustand des Benutzers enthält

Login

-oder-

Login

-oder-

Login

WebContext.Current.Authentication.Login(string, string)

-oder-

WebContext.Current.Authentication.Login(LoginParameters)

-oder-

WebContext.Current.Authentication.Login(LoginParameters, LoginOperation, object)

Asynchrones Überprüfen der Anmeldeinformationen des Benutzers

Logout

-oder-

Logout

WebContext.Current.Authentication.Logout(boolean)

-oder-

WebContext.Current.Authentication.Logout(LogoutOperation, object)

Asynchrones Abmelden eines authentifizierten Benutzers

LoadUser

-oder-

LoadUser

WebContext.Current.Authentication.LoadUser()

-oder-

WebContext.Current.Authentication.LoadUser(LoadUserOperation, object)

Laden eines authentifizierten Benutzers, Aktualisieren des Benutzerzustands, Laden der persistenten Benutzerauthentifizierung oder Abrufen des Prinzipalbenutzerobjekts bei Verwendung der Windows-Authentifizierung

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;
}

Rollen

Nachdem Sie die Authentifizierung implementiert haben, können Sie die Projektmappe zur Verwendung von Rollen konfigurieren. Mithilfe von Rollen können Sie Benutzer Gruppen zuweisen. Anschließend können Sie angeben, dass ein bestimmter Domänenvorgang nur für Mitglieder dieser Rolle verfügbar ist. Zum Einschränken des Zugriffs auf einen Domänenvorgang wenden Sie das RequiresRoleAttribute auf den Domänenvorgang an. Weitere Informationen finden Sie unter Gewusst wie: Aktivieren von Rollen in RIA Services.

Die folgenden Methoden und Eigenschaften werden normalerweise verwendet, wenn Sie Rollen implementiert haben.

Member Zu verwendender Code Aufgabe

Roles

WebContext.Current.User.Roles

Zugreifen auf die Rollen, denen der Benutzer zugewiesen ist

IsInRole

WebContext.Current.User.IsInRole(string)

Bestimmen, ob der authentifizierte Benutzer ein Mitglied einer angegebenen Rolle ist

Das folgende Beispiel zeigt einen Domänenvorgang, für den der Zugriff auf Mitglieder einer Rolle mit dem Namen "Managers" beschränkt ist.

<RequiresRole("Managers")> _
Public Function GetCustomers() As IQueryable(Of Customer)
    Return Me.ObjectContext.Customers
End Function
[RequiresRole("Managers")]
public IQueryable<Customer> GetCustomers()
{
    return this.ObjectContext.Customers;
}

Wenn Sie einen Domänenvorgang aufrufen und der Benutzer nicht über die erforderlichen Anmeldeinformationen verfügt, gibt der Domänenvorgang eine Ausnahme zurück. Sie können diese Situation vermeiden, indem Sie die Anmeldeinformationen vor dem Aufrufen des Domänenvorgangs überprüfen. Das folgende Beispiel zeigt, wie vor dem Laden der Daten überprüft wird, ob der Benutzer ein Mitglied der erforderlichen Rolle ist.

Private Sub LoadRestrictedReports()
    Dim loadSales = context.Load(context.GetSalesOrderHeadersQuery().Take(numberOfRows))
    SalesOrdersGrid.ItemsSource = loadSales.Entities
    SalesOrdersGrid.Visibility = System.Windows.Visibility.Visible

    If (WebContext.Current.User.IsInRole("Managers")) Then
        Dim loadCustomers = context.Load(context.GetCustomersQuery().Take(numberOfRows))
        CustomersGrid.ItemsSource = loadCustomers.Entities
        CustomersGrid.Visibility = System.Windows.Visibility.Visible
    Else
        CustomersGrid.Visibility = System.Windows.Visibility.Collapsed
    End If
End Sub
private void LoadRestrictedReports()
{
    LoadOperation<SalesOrderHeader> loadSales = context.Load(context.GetSalesOrderHeadersQuery().Take(numberOfRows));
    SalesOrdersGrid.ItemsSource = loadSales.Entities;
    SalesOrdersGrid.Visibility = System.Windows.Visibility.Visible;

    if (WebContext.Current.User.IsInRole("Managers"))
    {
        LoadOperation<Customer> loadCustomers = context.Load(context.GetCustomersQuery().Take(numberOfRows));
        CustomersGrid.ItemsSource = loadCustomers.Entities;
        CustomersGrid.Visibility = System.Windows.Visibility.Visible;
    }
    else
    {
        CustomersGrid.Visibility = System.Windows.Visibility.Collapsed;
    }
}

Profile

Profileigenschaften ermöglichen es Ihnen, Informationen zum Benutzer zu speichern. Sie können diese Eigenschaften verwenden, um die Anwendung für jeden Benutzer anzupassen. Um Profile in der Projektmappe verwenden zu können, müssen Sie die Lösung für Profile konfigurieren. Weitere Informationen finden Sie unter Gewusst wie: Aktivieren von Profilen in RIA Services.

Die folgenden Methoden und Eigenschaften werden normalerweise verwendet, wenn Sie Profile implementiert haben.

Member Zu verwendender Code Aufgabe

User

WebContext.Current.User

Zugreifen auf das Objekt, das alle Eigenschaften enthält, die Sie der User-Klasse hinzugefügt haben (z. B. User.PhoneNumber)

LoadUser

-oder-

LoadUser

WebContext.Current.Authentication.LoadUser()

-oder-

WebContext.Current.Authentication.LoadUser(LoadUserOperation, object)

Aktualisieren des Zustands des Benutzers

SaveUser

-oder-

SaveUser

WebContext.Current.Authentication.SaveUser(boolean)

-oder-

WebContext.Current.Authentication.SaveUser(SaveUserOperation, object)

Speichern von Änderungen des Benutzerzustands (z. B. nach dem Festlegen eines Profileigenschaftswerts)

Das folgende Beispiel zeigt, wie eine Benutzereigenschaft basierend auf dem vom Benutzer ausgewählten Wert festgelegt wird.

Private Sub OKButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles OKButton.Click
    Dim newSelection = Integer.Parse(defaultRows.SelectionBoxItem.ToString())
    If (newSelection <> WebContext.Current.User.DefaultRows) Then
        WebContext.Current.User.DefaultRows = newSelection
        WebContext.Current.Authentication.SaveUser(True)
    End If
    Me.DialogResult = True
End Sub
private void OKButton_Click(object sender, RoutedEventArgs e)
{
    int newSelection = int.Parse(defaultRows.SelectionBoxItem.ToString());
    if (newSelection != WebContext.Current.User.DefaultRows)
    {
        WebContext.Current.User.DefaultRows = newSelection;
        WebContext.Current.Authentication.SaveUser(true);
    }
    this.DialogResult = true;
}

Behandeln von Authentifizierungsfehlern auf dem Client

Fehler, die beim Anmelden, Abmelden, Laden oder Speichern von Benutzern auftreten, können behandelt werden, indem Sie beim Aufrufen dieser Methoden eine Rückrufmethode als Parameter bereitstellen. In der Rückrufmethode fügen Sie Code zum Behandeln des Fehlers hinzu, und Sie rufen die MarkErrorAsHandled-Methode auf, um anzugeben, dass keine Ausnahme vom Framework ausgelöst wird. Die AuthenticationService-Klasse ermöglicht es Ihnen, beim Aufrufen der folgenden Methoden eine Rückrufmethode bereitzustellen:

  • LoadUser

  • Login

  • Logout

  • SaveUser

Das Beispiel im obigen Abschnitt "Authentifizierung" zeigt eine Rückrufmethode zum Behandeln von Fehlern für den Login-Vorgang.

Weitere Informationen finden Sie unter Fehlerbehandlung auf dem Client.

Einschränken des Zugriffs auf einen Domänendienst

Nachdem Sie Authentifizierung und Rollen implementiert haben, können Sie den Zugriff auf einen Domänendienst auf bestimmte Benutzer beschränken. Dazu wenden Sie die folgenden Attribute auf den gesamten Domänendienst oder auf einzelne Vorgänge des Diensts an. Wenn Sie ein Attribut auf den gesamten Dienst anwenden, gilt es für alle Vorgänge.

  • RequiresAuthenticationAttribute – Gibt an, dass nur Benutzer mit gültigen Authentifizierungsinformationen auf den Vorgang zugreifen können.

  • RequiresRoleAttribute– Gibt an, dass nur authentifizierte Benutzer, die den angegebenen Rollen angehören, auf den Vorgang zugreifen können.

Sie können auch ein eigenes benutzerdefiniertes Autorisierungsattribut erstellen. Weitere Informationen finden Sie unter Gewusst wie: Erstellen eines benutzerdefinierten Autorisierungsattributs.

Das folgende Beispiel zeigt einen Domänendienst mit drei Domänenvorgängen. Die RequiresAuthenticationAttribute- und RequiresRoleAttribute-Attribute werden verwendet, um den Zugriff einzuschränken. Der GetProducts-Domänenvorgang steht allen Benutzern zur Verfügung, GetSalesOrderHeaders ist für authentifizierte Benutzer verfügbar und GetCustomers nur für Benutzer in der Rolle "Managers".

<EnableClientAccess()>  _
Public Class AdventureWorksDomainService
    Inherits LinqToEntitiesDomainService(Of AdventureWorksLT_DataEntities)

    <RequiresRole("Managers")> _
    Public Function GetCustomers() As IQueryable(Of Customer)
        Return Me.ObjectContext.Customers
    End Function
    
    Public Function GetProducts() As IQueryable(Of Product)
        Return Me.ObjectContext.Products
    End Function

    <RequiresAuthentication()> _
    Public Function GetSalesOrderHeaders() As IQueryable(Of SalesOrderHeader)
        Return Me.ObjectContext.SalesOrderHeaders
    End Function
End Class
[EnableClientAccess()]
public class AdventureWorksDomainService : LinqToEntitiesDomainService<AdventureWorksLT_DataEntities>
{
    [RequiresRole("Managers")]
    public IQueryable<Customer> GetCustomers()
    {
        return this.ObjectContext.Customers;
    }
 
    public IQueryable<Product> GetProducts()
    {
        return this.ObjectContext.Products;
    }

    [RequiresAuthentication()]
    public IQueryable<SalesOrderHeader> GetSalesOrderHeaders()
    {
        return this.ObjectContext.SalesOrderHeaders;
    }
}

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Verwenden des Authentifizierungsdiensts mit der Silverlight-Navigationsanwendung
Exemplarische Vorgehensweise: Verwenden des Authentifizierungsdiensts mit der Silverlight-Geschäftsanwendung

Konzepte

Sicherheit für WCF RIA Services