2013-12-10 21 views
11

Sto scoprendo che se aggiungo un utente a un ruolo in ASP Identity, non ha effetto fino a quando non esco ed effettuo nuovamente l'accesso. C'è qualcosa che devo fare per aggiornare i ruoli di un utente senza forzare un utente disconnettersi prima?MVC 5 AddToRole richiede il logout prima che funzioni?

Ecco come aggiungo l'utente al ruolo.

var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
var userId = HttpContext.Current.User.Identity.GetUserId(); 

userManager.AddToRole(userId, roleName); 

Quindi, quasi immediatamente, reindirizzo l'utente a questo metodo di azione. Posso dire nel database che sono stato aggiunto al ruolo corretto, ma MVC continua a reindirmi alla pagina di accesso. Tuttavia, se mi disconnetto, riaccedi e tento di accedere a questo metodo di azione, funziona perfettamente.

[Authorize(Roles = RecoveryStandardRoles.ServiceProvider)] 

    public partial class CertifyController : Controller 

{ 
    #region Public Methods and Operators 

    public virtual ActionResult CompanyProfile() 
    { 
     return this.View(); 
    } 

    #endregion 
} 

Grazie per aver dedicato tempo alla mia domanda!

+1

Se stai controllando se qualcuno è in un ruolo nel codice, 'User.IsInRole (roleName)' necessita di logout e login per riflettere che viene aggiunto al nuovo ruolo. 'UserManager.IsInRole (userID, roleName)' no. – nmit026

risposta

7

MVC5 Registra un nuovo utente, assegnare il ruolo e attivare utente con ruolo senza disconnettersi e tornare al sistema utilizzando: attendono UserManager.AddToRoleAsync (user.Id, "Nome ruolo")

if (ModelState.IsValid) 
{ 
    var user = new ApplicationUser() { UserName = model.Email, Email = model.Email,StandName = model.StandName,FirstName = model.FirstName,LastName = model.LastName,CellPhone = model.CellPhone,Supervisor = model.Supervisor}; 
    IdentityResult result = await UserManager.CreateAsync(user, model.Password); 

    var roleStore = new RoleStore<IdentityRole>(context); 
    var roleManager = new RoleManager<IdentityRole>(roleStore); 

    var userStore = new UserStore<ApplicationUser>(context); 
    var userManager = new UserManager<ApplicationUser>(userStore); 


    if (result.Succeeded) 
    { 
     ***await UserManager.AddToRoleAsync(user.Id, "Users Tammy");*** 
     await SignInAsync(user, isPersistent: false); 
+0

Questa risposta mi ha aiutato a risolvere questo problema. Ho avuto la linea per aggiungere l'utente a un ruolo ** dopo ** la linea per accedere. Una volta aggiunto il ruolo ** prima ** di accesso, il ruolo è stato aggiunto senza richiedere l'accesso/in. – hatmatbbat10

+0

Anni dopo aver creato la domanda, questa è la risposta che uso di più. La chiave è assicurarsi che sia 'AddToRoleAsync' _before_' SignInAsync' –

5

L'identità di ASP.NET utilizza le attestazioni per archiviare i ruoli e utilizza le attestazioni anziché eseguire una query di database ogni volta che è necessario eseguire l'autorizzazione. Quindi i ruoli non saranno nelle rivendicazioni fino a quando la persona non sarà stata nuovamente registrata. È possibile leggere su using claims in ASP.NET Identity here. Gli articoli mostrano come aggiungere attestazioni durante il processo di accesso. Ma se si aggiunge un ruolo all'utente corrente, è possibile aggiornare le rivendicazioni using the method described in my answer to this QA senza costringere l'utente ad accedere nuovamente. Esiste un reclamo per ogni ruolo assegnato all'utente. Utilizza ClaimTypes.Role quando aggiungi un nuovo ruolo.

+0

Questo non ha senso perché non ho nulla nella mia tabella delle richieste. AddUserToRole aggiunge un record a AspNetUserRoles e non c'è mai nulla in AspNetUserClaims. Puoi spiegarlo, per favore? –

+0

Inoltre, la riga AuthenticationManager.SignIn nella risposta a cui si fa riferimento non viene compilata. –

+1

Le affermazioni a cui mi riferisco non si trovano nella tabella del database. Sono nel CurrentPrincipal. –

6

@ kevin-junghans la tua risposta mi ha portato alla risposta corretta. Questo codice mostra come aggiungere un utente a un ruolo in MVC 5 e fare in modo che tale ruolo abbia automaticamente effetto.

var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
var userId = HttpContext.Current.User.Identity.GetUserId(); 

userManager.AddToRole(userId, roleName); 

var authenticationManager = HttpContext.Current.GetOwinContext().Authentication; 

authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); 

var user = userManager.FindById(userId); 
var identity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie); 

authenticationManager.SignIn(new AuthenticationProperties { IsPersistent = false }, identity); 
+1

Si sta effettivamente registrando la persona fuori e di nuovo dentro, che funzionerà. Il metodo CreateIdentity aggiungerà nuovamente i ruoli come attestazioni, aggiungendo in modo efficace il nuovo ruolo. Il metodo che ho descritto può rispondere non richiede di interrogare nuovamente il database per riempire queste affermazioni. –

2

Dopo l'aggiunta di un ruolo per l'utente corrente è possibile aggiornare rivendicazioni, senza costringere l'utente a disconnettersi e accedere nuovamente.

Dim owinAuth = HttpContext.Current.GetOwinContext().Authentication 
Dim authResult = Await owinAuth.AuthenticateAsync(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie) 

authResult.Identity.AddClaim(New System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Role, "RoleName")) 

codice C# Equivalente di riferimento:

var owinAuth = HttpContext.Current.GetOwinContext().Authentication; 

var authResult = 
    await owinAuth.AuthenticateAsync(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie); 

authResult.Identity.AddClaim(new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Role, roleName));