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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top