2012-11-03 10 views
7

Wie in allen Branchenanwendungen kann eine Anwendung mehrere Users mit einigen zugewiesenen Roles haben. Wir haben kürzlich auf WPF MVVM Architecture umgestellt und suchen nach der besten Möglichkeit, jedem angemeldeten Benutzer eine Rolle zuzuweisen. Es gibt viele Begriffe, die über das Internet laufen, wie Authentifizierung, RoleManager, LoginService usw., aber ich bin mir nicht sicher, mit wem ich arbeiten soll.Zuweisen von Rollen zu Anwendungsbenutzern

Hier ist, was wir haben:

Eine kleine Business-Anwendung (mit 20 Forms), innerhalb eines einzigen Projekts entwickelt. Wir verwenden MVVM Architektur, LINQ-to-SQL als DataAccess und Model, mit Repository pattern und Unit Of Work.

Was wir wollen:

Es gibt verschiedene Formen und jede Form hat Einsatz, Update, , Druck etc Operationen löschen. Was wir wollen ist, einen angemeldeten Benutzer entsprechend seiner Rolle zu beschränken - auf die Aufgabe, die er ausführen kann. d.h. z.B. Admin ist frei zu tun "irgendetwas" mit der Anwendung, während einige andere Benutzer möglicherweise nicht erlaubt, einige Formulare zu sehen oder einige Operationen ausführen (nämlich aktualisieren oder löschen).

Wie können wir das erreichen? Welche Art von Service könnte verwendet werden, um diesen vollständigen Mechanismus unter Verwendung der MVVM-Architektur in einer Desktop-LOB-Anwendung auszuführen. Ein technischer Begriff oder ein Tutorial-Link wird hilfreich sein.

Ich hoffe, ich bin klar und vielen Dank im Voraus.

Edit: Ich ging durch viele Foren und Artikel herum, aber alle von ihnen konzentriert sich auf ASP.NET. Sie können immer noch keine konkrete Implementierung für die Zuweisung von Rollen in WPF finden. Und die Quellen auf ASP.NET entsprechen nicht gut mit WPF.

+0

Was mvvm Rahmen Sie verwendet haben oder haben Sie Ihre eigene Rolle? –

+1

Wir haben das gleiche Problem. Die meisten Berechtigungen sind fest codiert. Wir planten, vollwertige ACL zu implementieren. Mein Kollege bietet WCF Roles Service (http://msdn.microsoft.com/en-us/library/bb386424(v=vs.100).aspx) als fertige Infrastruktur an. Wir sind uns aber immer noch nicht sicher, wie wir Berechtigungen in Viewmodels am besten anwenden können, weil wir so viel wie möglich hardcoding vermeiden wollen. Wir haben uns auch entschieden, Prism zu betrachten. Wir vermuten, dass es die erforderliche Funktionalität enthält. –

+0

Haben Sie jemals darüber nachgedacht, AOP für diese Aufgabe zu verwenden? http://izlooite.blogspot.ru/2010/06/aspect-oriented-programming.html http://stackoverflow.com/questions/325558/aspect-oriented-programming-examples http: //www.sharpcrafters .com/ Disclaimer: Ich bin neu in diesem Ansatz und weiß fast nichts darüber. Aber Code-Kontakte sind gleich, also denke ich, dass es helfen könnte. –

Antwort

4

Ich würde vorschlagen, eine Lösung um die ASP.NET Membership & Role Management Anbieter bauen (trotz der Bearbeitung auf Ihre ursprüngliche Frage). Sie sind gut dokumentiert auf MSDN & sind sehr flexibel.

Hier sind ein paar Links, die hoffentlich mit der WPF-Integration helfen sollte:

Auch Sie erwähnt, dass Sie MVVM verwenden; Ich würde vorschlagen, eine statische Klasse oder sonst global zugängliche Eigenschaft (siehe: WPF Application using a global variable) einer Instanz einer zentralisierten Berechtigungsklasse zu haben. Die Methoden dieser Klasse könnten dann von überall in der App (d. H. In den ViewModels) aufgerufen werden, um die geeigneten Merkmale basierend auf den Berechtigungen, die dem Benutzer gewährt wurden, zu aktivieren/deaktivieren oder ein-/auszublenden.

0

Was ich tun würde, ist eine statische Klasse in der Client-Schicht mit Informationen des aktuellen Benutzers (Rollen, Berechtigungen, etc.) zu erstellen. Diese Berechtigungen könnten zum Beispiel durch eine Enumeration oder etwas Ähnliches modelliert werden, dann können Sie in jedem ViewModel definieren, welcher dieser Enum-Werte zum Beispiel benötigt wird, um Abfragen durchzuführen (die Datensätze anzuzeigen) oder die Befehle Speichern oder Bearbeiten auszuführen.

0

Ich würde einfach eine RequiredRole-Eigenschaft in jedem Befehl setzen und eine Überschreibung von CanExecute hinzufügen, die überprüft, ob der aktuelle Benutzer das Recht hat, dies zu tun. Dies ist genug für Befehle.

Auf der anderen Seite, Rechte ein Formular anzuzeigen müssen in Ihrem Schirmleiter/Tab Host/...

die Rollen holen und mit Linq to Sql, und es ist jede suer Rolle überprüft werden. Ich würde mich nicht darum kümmern, externen Code für solch eine einfache Aufgabe zu integrieren.

Wenn Sie es allgemeiner machen möchten, behalten Sie in Ihrer Datenbank eine Tabelle bei, die Befehle/Formulare und Rollen verknüpft, und verwenden Sie reflection, um Benutzer zu autorisieren.

Ich hoffe, Sie, dass nützliche

0

finden wir AD verwenden die Rollen ein Benutzer gehört, zu bestimmen. Überprüfen Sie dann, ob eine der Rollen die richtige Berechtigung hat.Sie könnten jedoch eine roles und userroles Tabelle verwenden, um diesen Teil selbst zu machen.

Mit einem dieser beiden Ansätze wird der Benutzer in einer Reihe von Rollen sein. Das ist der erste Schritt.

Dann müssen Sie an der Stelle der Aktion überprüfen, dass der Benutzer die Erlaubnis hat. Unsere Menüstruktur wird dynamisch aus der Datenbank aufgebaut, so habe ich eine Tabelle von MenuItems und dann eine Tabelle, die RoleMenuAvailability definiert.

Die erste hat eine Id, eine order, die Title, Image source und die navigation target, zusammen mit einigen anderen Bereichen.

Die zweite hat die RoleId und die menuId und ob es editierbar ist. So das Vorhandensein der Reihe bedeutet, sein lesbar (wenn ein Navigationsziel dh Form) Die Menüpunkte werden dann aus der Datenbank eingelesen:

var usersItems = 
    items.Where(i => i.RoleMenuAvailabilities 
        .Any(r => domainUser.IsInDomainRole(r.UserRole.Description))) 
     .OrderBy(m => m.MenuOrder); 

UserRole.Description in unserem Fall ist der Name der AD Rolle und IsInDomainRole ist eine Hilfsfunktion:

public bool IsInDomainRole(string role) 
{ 
    var regex = new Regex("[^\\\\]+$"); 
    string name = this.Name ?? string.Empty; 
    string domainRole = regex.Replace(name, role); 
    return this.IsInRole(domainRole); 
} 

Die rolemenuavailability Tabelle zusätzliche Flags auf sie ausgedehnt werden könnte zum löschen, Update, fügen etc, wenn Sie benötigt.

Wir haben die nächsten Schritte noch nicht vollständig implementiert, aber wir beabsichtigen, dass die Benutzerrechte für den Benutzer zwischengespeichert werden. Unsere ViewModel-Basisklasse hat einen Verweis auf den Benutzer und kann somit die CanEdit(int permissionId)-Funktion aufrufen. Dann können die Eigenschaften, die im Wesentlichen die Sichtbarkeit steuern, oder die Befehle CanExecute auf die Benutzerberechtigungen zugreifen und herausfinden, ob sie die Berechtigung für die jeweilige Aktion haben.

Es ist immer noch eine Arbeit in Arbeit, so wird es interessant sein zu sehen, was andere Vorschläge hier kommen.

Verwandte Themen