Ciao Mario,
ma io vorrei assegnare il ruolo man mano che gli utenti si registrano
Si può fare, ma non puoi copiare-incollare il codice che ti mando, altrimenti non funzionerà mai. Devi spendere del tempo per capire cosa fa e poi adeguarlo alla tua situazione.
Prendi questa riga di codice, per esempio:
Dim user1 = userManager.FindByName("Mario")
Questa serve a recuperare un utente chiamato "Mario". Ma tu nel form di registrazione
non hai creato un utente chiamato "Mario". Tu stai creando un utente il cui nome risiede nella casella UserName.Text.
Quindi al limite avresti dovuto fare:
Dim user1 = userManager.FindByName(UserName.Text)
A proposito del ruolo: non devi crearlo ogni volta con
roleManager.Create. Come dice il nome del metodo
Create, questo serve per creare un ruolo. Quindi dovrai crearlo solo se non esiste già.
Cambia il codice così:
Protected Sub CreateUser_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim userStore = New UserStore(Of IdentityUser)()
Dim roleStore As New RoleStore(Of IdentityRole, String, IdentityUserRole)(userStore.Context)
'Creo userManager e roleManager che sono gli oggetti da usare per gestire gli utenti e i ruoli
Dim userManager = New UserManager(Of IdentityUser)(userStore)
Dim roleManager As New RoleManager(Of IdentityRole)(roleStore)
'Creo un nuovo utente
Dim user = New IdentityUser() With {
.UserName = UserName.Text
}
'Chiedo che il nuovo utente venga salvato nel database
Dim userCreationResult As IdentityResult = userManager.Create(user, Password.Text)
'Verifico se la creazione dell'utente nel database ha avuto successo
If userCreationResult.Succeeded Then
'L'utente è stato creato, mi preparo ad assegnare il ruolo all'utente
Dim roleName = "Guest"
'Verifico se il ruolo esiste nel database
If Not roleManager.RoleExists(roleName) Then
'Se non esiste lo creo
Dim role As New IdentityRole(roleName)
roleManager.Create(role)
End If
'Chiedo che il ruolo sia assegnato all'utente nel database
Dim roleAssignmentResult = userManager.AddToRole(user.Id, roleName)
'Verifico che l'assegnazione del ruolo all'utente si sia conclusa con successo
If roleAssignmentResult.Succeeded Then
'Tutto ok: il ruolo è stato assegnato all'utente
StatusMessage.Text = String.Format("User {0} was created successfully and it was added to the {1} role", UserName.Text, roleName)
Else
'Si è verificato un errore nell'assegnare il ruolo all'utente
'L'utente però era stato creato
StatusMessage.Text = roleAssignmentResult.Errors.FirstOrDefault()
End If
Else
'C'è stato un errore di creazione dell'utente
StatusMessage.Text = userCreationResult.Errors.FirstOrDefault()
End If
End Sub
Studia il funzionamento degli oggetti
roleManager e
userManager. In Visual Studio puoi scrivere
roleManager. oppure
userManager. (col punto alla fine) per far apparire l'intellisense. Lì potrai vedere che ci sono tanti metodi che ti permettono di recuperare, creare e salvare ruoli e utenti.
Ci devi mettere impegno per capire il codice che ti posto, altrimenti se fai copia-incolla non riuscirai a raggiungere il tuo obiettivo.
ciao,
Moreno