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.
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.
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 |
---|---|---|
|
Zugreifen auf den Authentifizierungsdienst |
|
|
Zugreifen auf das Objekt, das den Zustand des Benutzers enthält |
|
-oder- -oder- |
-oder-
-oder-
|
Asynchrones Überprüfen der Anmeldeinformationen des Benutzers |
-oder- |
-oder-
|
Asynchrones Abmelden eines authentifizierten Benutzers |
LoadUser -oder- |
-oder-
|
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 |
---|---|---|
|
Zugreifen auf die Rollen, denen der Benutzer zugewiesen ist |
|
|
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 |
|
Zugreifen auf das Objekt, das alle Eigenschaften enthält, die Sie der |
LoadUser -oder- LoadUser |
-oder-
|
Aktualisieren des Zustands des Benutzers |
-oder- |
-oder-
|
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