Aggiunta di ruoli personalizzati - VB 2008 WinForms
-
21-09-2019 - |
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
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.