Domanda

Ho un WinForms (VB 2008) app based che sto sviluppando e voglio utilizzare i ruoli personalizzati per l'accesso degli utenti.

Layout di applicazione: Ho una forma principale che apre un form di login quando si verificano determinate azioni. Il modulo di accesso stagista utilizza una classe di autenticazione che ho creato, per autenticare gli utenti e diritti di accesso set. Sulla mia pagina delle impostazioni di applicazioni, ho impostato la modalità di autenticazione per applicazioni definita perché non posso usare l'autenticazione di Windows nell'ambiente in cui sarà distribuito.

L'applicazione utilizza un 2005 db MS SQL e le 3 tabelle che sto utilizzando nel processo di autenticazione sono i USER_ACCOUNT, User_Roles e tavoli user_access. La combinazione di un account del USER_ACCOUNT e ruoli all'interno della tabella User_Roles sono le basi per la tabella user_access. Utilizzando la tabella user_access è come assegno di accedere alle varie funzioni all'interno dell'applicazione

Metodo di autenticazione: Per autenticare un utente, sto usando il metodo (codice qui sotto) "My.User.CurrentPrincipal". L'oggetto My.User grandi opere e permette l'uso di proprietà "My.User.Name" in tutto l'app quando si fa riferimento per l'utente attualmente autenticato.

Metodo di accesso: Al fine di impostare i livelli di accesso degli utenti attuali Sto usando una funzione all'interno della mia classe di autenticazione e passando My.User.Name come variabile. La funzione utilizza un set di dati Table Adapter e un'istruzione Select Case all'interno di un ciclo for per assegnare tutti i livelli di accesso per l'utente (codice funzione di seguito).

Il mio problema: Questo metodo di assegnazione di diritti di accesso a un utente funziona ma non è persistente in tutta l'applicazione come oggetto My.User è. Mi piacerebbe trovare un modo per creare ruoli personalizzati attraverso l'oggetto My.User utilizzando la sua proprietà .IsInRole. Vorrei avere questi ruoli creati dinamicamente utilizzando il mio tavolo User_Roles. Ciò consentirebbe ai ruoli personalizzati da utilizzare in tutta la mia applicazione utilizzando il My.User.IsInRole ( "MyRole") la sintassi ... simile a come sono attualmente in grado di utilizzare My.User.Name. Purtroppo gli unici ruoli che posso attualmente convalidare contro sono l'costruiti in account di tipo di Windows (Adminisrator ... ect.).

Ho trovato un sacco di informazioni ed esempi relativi a ASP.Net così come la creazione di autenticazione di Windows WinForms, ma nulla finora direttamente connesse con il mio problema. Penso che ci sia un modo per ottenere questo ... ma io non sono riuscito a trovarlo. Qualsiasi aiuto sarebbe molto apprezzato !!

Grazie per il vostro aiuto!


'esempio Autenticazione utente:

If Authenticate.CheckPassword(tbxUserName.Text, strPassword) Then
            My.User.CurrentPrincipal = New GenericPrincipal(New GenericIdentity(tbxUserName.Text), Nothing)

'esempio assegnazione di accesso:

 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
È stato utile?

Soluzione

Credo che è necessario implementare un oggetto IPrincipal personalizzato che accede vostra tabella SQL. Prova questa pagina .

Modifica:

In primo luogo, dare un'occhiata alle definizioni di IIdentity e IPrincipal . Potrai notare che IIdentity non ha una proprietà 'ruolo' definito. Hanno scelto di implementare una proprietà aggiuntiva denominata Ruolo sulla loro attuazione IIdentity (SampleIIdentity) e poi hanno usato dal loro implementazione di IPrincipal. Quello che sto suggerendo è che si sceglie di implementare la vostra proprietà Role (che interroga la vostra tabella esistente) e restituisce uno (o un array) di un tipo di ruolo ti definisci. Poi nell'implementazione di IPrincipal, è possibile codificare IsInRole per interrogare la nuova proprietà Role. Si spera che ha più senso che la mia risposta piuttosto striminzito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top