2015-05-21 17 views
7

Sto utilizzando Identity 2 per l'autenticazione nel sito Web mvc 5. A mio avviso, voglio verificare il ruolo dell'utente:User.IsInRole return false

@if(User.IsInRole("Customers")) 
{ 
    @*do something*@ 
} 

ma questo ritorno sempre false, ho già impostato <roleManager enabled="true" /> nella configurazione web. qualsiasi aiuto per favore.

+0

Il database indica che l'utente ha sicuramente un ruolo e il nome del ruolo è corretto? E l'utente ha sicuramente effettuato l'accesso? IE ... se aggiungi un '[Authorize]' al controller, le azioni vengono caricate? – Luke

+0

Il nome del ruolo è corretto ed esiste in db per questo utente. –

+0

Se si aggiunge '[Autorizza (ruoli =" Clienti ")]' alla propria azione, viene caricata l'azione? Come hai aggiunto l'utente al ruolo? – Luke

risposta

6

Ho appena finito di funzionare con il mio setup che utilizza anche Identity Framework.

ho aggiunto un utente a un ruolo utilizzando il seguente codice:

this.RoleManager.CreateAsync(new Role() {Name = "Customers"}); 

this.UserManager.AddToRoleAsync(this.User.Identity.GetUserId<int>(), "Amazing"); 

Poi in qualsiasi momento dopo che, quando mi sono imbattuto User.IsInRole("Customers"); è tornato falsa, che è stato fino li relogged indietro nel

.

È necessario registrare nuovamente l'utente dopo aver aggiunto l'utente al ruolo. Le informazioni sul ruolo sono memorizzate nei cookie.

Ho eseguito il seguente per registrare nuovamente l'utente:

var user = await this.UserManager.FindByNameAsync("bob"); 
var identity = await this.UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); 

this.AuthManager.SignIn(new AuthenticationProperties() { IsPersistent = true }, identity); 

Da questo punto, User.IsInRole("Customers") funzionato per me e restituito true.

Questo non funziona se non è possibile verificare all'interno dell'applicazione che è a conoscenza del ruolo a cui si desidera aggiungerli. È possibile verificare l'esistenza del ruolo "Clienti" utilizzando il RoleManager nel seguente modo:

var roleExists = (this.RoleManager.FindByNameAsync("Customers").Result != null); 
1

Ho lo stesso problema dal momento che personalizza la classe IdentityDbContext. E il motivo per cui lo User.IsInRole("Customers") è sempre falso nel mio caso è perché ho il caricamento pigro EF disattivato sulla mia classe di contesto personalizzata. Ho provato ad attivare il caricamento lazy di quanto ho disconnesso e poi dentro, e il User.IsInRole sta restituendo il valore previsto.

public partial class Context : IdentityDbContext<User> 
    { 
     public Context() : base("name=Context") 
     { 
      this.Configuration.LazyLoadingEnabled = true;   
     } 
+0

Prima ho pensato questo era una soluzione ma nel mio caso il malfunzionamento non è deterministico. Secondo il mio debug il 'LazyLoadingEnabled = true;' è l'impostazione predefinita (MVC 5) –