2013-11-21 6 views
18

Ich habe eine ASP.NET MVC 5-Anwendung. Ich verwende den standardmäßigen ASP.NET Identity-Provider für die Benutzer- und Rollenverwaltung. Es ist wichtig, dass ich den IdentityUser aus einem eigenen Repository-Projekt verwende, aber das scheint in Ordnung zu sein. Ich kann mich registrieren, anmelden, Benutzer bearbeiten und ihre Rollen verwalten.ASP.NET Identitätsüberprüfung Benutzerrollen funktioniert nicht

ich hinzufügen Benutzer zu Rolle mit diesen Zeilen:

UserManager.AddToRole(userdetail.Id, r); 
db.Entry(userdetail).State = EntityState.Modified; 
db.SaveChanges(); 

Dies scheint in DB-Ebene arbeiten.

Aber ich nicht rollenbasierte Authentifizierungen verwenden können, tatsächlich die simples

HttpContext.User.IsInRole("Administrator") 

nicht zu nicht funktioniert.

[Authorize(Roles="Administrator")] 

funktioniert nicht auch.

kann ich überprüfen, nur mit dieser Methode, ob Benutzer ein Administrator ist:

UserManager.IsInRole(userID, "Administrator"). 

Warum?

In jedem Tutorial, was ich gefunden habe, funktioniert alles gut. Das unterschiedliche Projekt-Repository könnte der Grund sein? Oder ASP.NET Identität ist so viel gebrochen?

Bitte Beratung,

+3

Ich habe das gleiche Problem. Irgendeine Lösungsmöglichkeit? – janhartmann

+0

Die Antwort wurde veröffentlicht. Akzeptieren. Der eine von jd4u. – DtechNet

Antwort

13

Es scheint ein Problem.[Die Frage nach Design]

  • Die Rollennamen sind Groß- und Kleinschreibung in AuthorizeAttribute und User.IsInRole
  • Die Rollennamen sind Groß- und Kleinschreibung in UserManager.IsInRole

Darüber hinaus prüfen Der korrekte Rollenname wird für die Überprüfung verwendet.

[Das obige basiert auf dem Test, der mit dem nachstehenden Code durchgeführt wurde. Role Name = "Admin", Benutzer hinzugefügt Rolle "Admin".]

[Authorize(Roles="Admin")] /*True as "Admin" has A capital as entered in Role name*/ 
public ActionResult Secured() 
{ 
    if (User.IsInRole("admin")) /*This is False*/ 
    { 
     Console.WriteLine("In"); 
    } 
    if(UserManager.IsInRole(User.Identity.GetUserId(), "admin")) /*This is True!!*/ 
    { 
     Console.WriteLine("In"); 
    } 
    return View(); 
} 

Wenn wir das Attribut [Authorize(Roles="admin")] ändern, leitet es zur Anmeldeseite.

+0

Wissen Sie, wie Sie diese Ursache umgehen können, habe ich genau das gleiche Problem. Ich benutze benutzerdefinierte Benutzer und Rollenspeicher, aber ich denke, es sollte beachtet werden, aber es funktioniert gut mit dem Manager und nicht über Benutzer und Annotation. – Baserz

+0

Dies rettete mein Leben Ich weiß nicht, warum diese Antwort nicht akzeptiert wurde. Nichts anderes erwähnt dies. Gehe auf "Identity userinrole" bei Google und du wirst die ungenaue "User.IsInRole" sehen <- funktioniert nicht !! Sicher, sie sind alte Fragen und ASP.NET MVC 5 ist jetzt 2 Jahre alt, aber naja. Wenn jemand den originalen MVC 5 Stack programmiert, dann ist es das! Wahrscheinlich auch für .NET CORE. – DtechNet

+0

Groß-/Kleinschreibung in diesem Fall ist nur kriminell, es muss ein Fehler sein. Ich habe das in meinem eigenen Code gefunden und diese Antwort nur gefunden, nachdem ich einen schönen Teil der Zeit verschwendet habe. Deine Antwort aufheben! –

0

Wollen Sie diesen Eintrag in Ihrem web.config haben?

Wenn ich mich richtig erinnere, gibt es auch einen anderen Namespace für die Rollenanbieter Assembly in verschiedenen Versionen von .NET.

+9

Sprechen Sie über die neueste ASP.NET MVC 5 mit ASP.NET Identity? – martonx

22

In diesem Fall müssen Sie sich abmelden und den Benutzer erneut anmelden.

Da die Rollen Daten auch in Cookies gespeichert wird, So müssen Sie den Cookie-Ausgabe wieder zu arbeiten.

+2

Sie können dasselbe auch erreichen, ohne den Benutzer durch Aktualisieren des Sicherheitsstempels erneut anmelden zu müssen. Siehe http://stackoverflow.com/a/19505060/110871 – Funka

+1

coole Antwort .... –