2015-05-21 15 views
7

Ich verwende Identity 2 zur Authentifizierung in der mvc 5-Website. Aus meiner Sicht mag ich die Rolle des Benutzers überprüfen:User.IsInRole return false

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

aber diese Rückkehr immer falsch, ich habe bereits gesetzt <roleManager enabled="true" /> in dem Web-Config. jede Hilfe bitte.

+0

Gibt Ihre Datenbank an, dass der Benutzer definitiv in der Rolle ist und der Rollenname genau richtig ist? Und ist der Nutzer definitiv eingeloggt? IE ... Wenn Sie dem Controller ein '[Authorize]' hinzufügen, laden Sie die Aktionen? – Luke

+0

Der Name der Rolle ist korrekt und sie existiert in db für diesen Benutzer. –

+0

Wenn Sie '[Autorize (Roles =" Customers ")]' zu Ihrer Aktion hinzufügen, wird die Aktion geladen? Wie haben Sie den Benutzer zur Rolle hinzugefügt? – Luke

Antwort

6

Ich habe es gerade mit meiner Einrichtung arbeiten, die auch Identity Framework verwendet.

habe ich einen Benutzer zu einer Rolle mit dem folgenden Code:

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

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

jederzeit danach Dann, als ich User.IsInRole("Customers"); lief es falsch zurück, das war, bis ich sie in relogged zurück

.

Sie müssen den Benutzer erneut anmelden, nachdem Sie den Benutzer der Rolle hinzugefügt haben. Die Rolleninformation ist in den Cookies gespeichert.

Ich lief wieder dem Benutzer die folgenden protokollieren:

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

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

Von diesem Punkt User.IsInRole("Customers") für mich gearbeitet und kehrte true.

Dies funktioniert jedoch nicht, es sei denn, Sie können in Ihrer Anwendung überprüfen, ob die Rolle bekannt ist, der Sie sie hinzufügen möchten.

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

Ich habe das gleiche Problem, da ich die IdentityDbContext Klasse anpassen: Sie können mit Ihrem Rolemanager in der folgenden Art und Weise die Existenz der Rolle „Kunden“ überprüfen. Und der Grund, warum die User.IsInRole("Customers") in meinem Fall immer falsch ist, liegt daran, dass ich die EF-Lazy-Ladefunktion für meine benutzerdefinierte Kontextklasse deaktiviert habe. Ich habe versucht, das lazy loading zu aktivieren, als ich mich abgemeldet habe, und dann rein und der User.IsInRole gibt den erwarteten Wert zurück.

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

Zuerst dachte ich das war eine Lösung, aber in meinem Fall ist die Fehlfunktion nicht deterministisch. Laut meinem Debug ist der 'LazyLoadingEnabled = true;' der Standard (MVC 5) –

Verwandte Themen