Benutzerdefinierte Rollen hinzufügen – VB 2008 Winforms
-
21-09-2019 - |
Frage
Ich entwickle eine auf Winforms (VB 2008) basierende App und möchte benutzerdefinierte Rollen für den Benutzerzugriff verwenden.
Anwendungslayout:Ich habe ein Hauptformular, das bei bestimmten Aktionen ein Anmeldeformular öffnet.Der Praktikant im Anmeldeformular verwendet eine von mir erstellte Authentifizierungsklasse, um Benutzer zu authentifizieren und Zugriffsrechte festzulegen.Auf meiner Anwendungseinstellungsseite habe ich den Authentifizierungsmodus auf „Anwendungsdefiniert“ eingestellt, da ich die Windows-Authentifizierung in der Umgebung, in der sie bereitgestellt wird, nicht verwenden kann.
Die Anwendung verwendet eine MS SQL 2005-Datenbank und die drei Tabellen, die ich im Authentifizierungsprozess verwende, sind die Tabellen User_Account, User_Roles und User_Access.Die Kombination aus einem Konto im User_Account und den Rollen in der User_Roles-Tabelle sind die Grundlagen für die User_Access-Tabelle.Mithilfe der Tabelle „User_Access“ weise ich den Zugriff auf die verschiedenen Funktionen innerhalb der Anwendung zu
Authentifizierungsmethode: Um einen Benutzer zu authentifizieren, verwende ich die Methode „My.User.CurrentPrincipal“ (Code unten).Das My.User-Objekt funktioniert hervorragend und ermöglicht die Verwendung der Eigenschaft „My.User.Name“ in der gesamten App, wenn auf den aktuell authentifizierten Benutzer verwiesen wird.
Zugriffsmethode:Um die Zugriffsebenen des aktuellen Benutzers festzulegen, verwende ich eine Funktion in meiner Authentifizierungsklasse und übergebe My.User.Name als Variable.Die Funktion verwendet einen Dataset Table Adapter und eine Select Case-Anweisung innerhalb einer For-Schleife, um dem Benutzer alle Zugriffsebenen zuzuweisen (Funktionscode unten).
Mein Problem:Diese Methode zum Zuweisen von Zugriffsrechten an einen Benutzer funktioniert zwar, ist jedoch nicht wie das My.User-Objekt in der gesamten Anwendung beständig.Ich möchte eine Möglichkeit finden, benutzerdefinierte Rollen über das My.User-Objekt mithilfe seiner .IsInRole-Eigenschaft zu erstellen.Ich möchte, dass diese Rollen mithilfe meiner User_Roles-Tabelle dynamisch erstellt werden.Dadurch könnten die benutzerdefinierten Rollen in meiner gesamten Anwendung mithilfe der My.User.IsInRole("MyRole")-Syntax verwendet werden ... ähnlich wie ich derzeit My.User.Name verwenden kann.Leider sind die einzigen Rollen, anhand derer ich derzeit validieren kann, die integrierten Windows-Konten (Administrator usw.).
Ich habe viele Informationen und Beispiele im Zusammenhang mit ASP.Net und der Einrichtung der Winforms-Windows-Authentifizierung gefunden, aber bisher nichts, was direkt mit meinem Problem zu tun hat.Ich denke, es gibt einen Weg, dies zu erreichen ... aber ich konnte ihn nicht finden.Jede Hilfe wäre sehr dankbar!!
Ich danke Ihnen für Ihre Hilfe!
'Beispiel für die Benutzerauthentifizierung:
If Authenticate.CheckPassword(tbxUserName.Text, strPassword) Then
My.User.CurrentPrincipal = New GenericPrincipal(New GenericIdentity(tbxUserName.Text), Nothing)
'Beispiel für die Zugriffszuweisung:
Public Shared Function GetUser(ByVal strUsername As String) As Authenticate
Using UserAdapter As New dbUserTableAdapters.User_AccountsTableAdapter()
Dim UserTable As dbUser.User_AccountsDataTable = UserAdapter.GetByUser(strUsername)
Dim tempUser As New Authenticate() _
With {.ID = UserTable(0).id, _
.Username = UserTable(0).User_Name, _
.Password = UserTable(0).id}
Using AccessAdapter As New dbUserTableAdapters.User_AccessTableAdapter()
Dim AccessTable As dbUser.User_AccessDataTable = AccessAdapter.GetByUser(tempUser.ID)
For c As Integer = 0 To AccessTable.Rows.Count - 1
Select Case AccessTable(c).Role_Id
Case RoleType.SysAdmin
tempUser.AllowSysAdmin = True
Case RoleType.Maintenance
tempUser.AllowMaintenance = True
Case RoleType.ReportAll
tempUser.AllowRptAll = True
Case RoleType.ReportException
tempUser.AllowRptExceptions = True
Case RoleType.EventManagment
tempUser.AllowEventStart = True
Case Else
End Select
Next
Return tempUser
End Using
End Using
End Function
Lösung
Ich denke, Sie müssen ein benutzerdefiniertes IPrincipal-Objekt implementieren, das auf Ihre SQL-Tabelle zugreift.Versuchen Das Seite.
Bearbeiten:
Schauen Sie sich zunächst die Definitionen von an Identität Und IPrincipal.Sie werden feststellen, dass für IIdentity keine „Role“-Eigenschaft definiert ist.Sie haben sich dafür entschieden, eine zusätzliche Eigenschaft namens „Role“ in ihrer Implementierung von IIdentity (SampleIIdentity) zu implementieren und diese dann aus ihrer Implementierung von IPrincipal zu verwenden.Ich schlage vor, dass Sie Ihre eigene Role-Eigenschaft implementieren (die Ihre vorhandene Tabelle abfragt) und einen (oder ein Array) eines von Ihnen selbst definierten Role-Typs zurückgibt.Anschließend können Sie in Ihrer Implementierung von IPrincipal IsInRole codieren, um die neue Role-Eigenschaft abzufragen.Hoffentlich macht das mehr Sinn als meine eher knappe Antwort.