2015-05-24 13 views
5

Ich versuche, die Identity-Lösung MVC 5 zu verwenden, aber blieb auf etwas, das sehr einfach sein sollte: Ich möchte die Login-Methode auf dem AccountController Erhalte den Namen des angemeldeten Benutzers direkt nach der Validierung des Modells (und ich möchte es nicht aus dem Modell verwenden!).Die Identität von MVC 5 kann den Benutzernamen nicht direkt nach dem Anmelden erhalten

Hier ist ein Stück von meinem Code:

var result = await SignInManager.PasswordSignInAsync(model.Login, model.Password, false, shouldLockout: false); 
string NomeUsuario = ""; 
if (result == SignInStatus.Success) 
{ 
    NomeUsuario = User.Identity.Name; //<== getting the logged user's name 
} 

Das Problem, das ich erhalte, ist, dass diese Eigenschaft null ist.

Nach vielen Tests habe ich etwas Seltsames erkannt: Wenn ich zweimal authentifiziere, wird es im zweiten Durchgang funktionieren. Aber jedes Mal, wenn ich mich abmelde und versuche, mich erneut anzumelden, wird der Name des Benutzers null.

Irgendwelche Hilfe, was ist falsch damit?

+0

Wie beantwortet, können Sie die Forderungen nicht zugreifen, noch die Identität dieser Stelle im Prozess. In diesem Stadium haben Sie wahrscheinlich den Benutzer aus der DB gelesen, so dass Sie wahrscheinlich die Informationen, die Sie benötigen, bereits zur Hand haben. –

+0

Sehen Sie meine Antwort, wie Sie die Identität und alle Ansprüche, die in der Datenbank gespeichert sind, sofort erhalten, ohne nach einer erfolgreichen Anmeldung erneut in die Datenbank zu gehen. –

Antwort

7

Am Ende seiner Ausführung Kette SignInManager.PasswordSignInAsync Methode fordert für SignInAsync Methode, die im Grunde verantwortlich für die Einrichtung einer Authentifizierung Cookie, die mehrere Ansprüche über einen Benutzer (einer von ihnen ist es Name) enthält. Der Grund, warum Sie User.Identity.Name in dem gleichen Anruf mit SignInManager.PasswordSignInAsync nicht verwenden können, ist, dass User.Identity mit den Ansprüchen von Authentifizierungscookie ausgefüllt (die noch nicht analysiert werden). Der Grund dafür, dass es beim zweiten Durchlauf funktioniert, ist, dass der Cookie da ist und User.Identity ordnungsgemäß gefüllt ist. Die meiste Zeit nach einer erfolgreichen Anmeldung gibt es eine Umleitung zu einer Seite. Innerhalb dieser Redirect-Aktion können Sie User.Identity verwenden, da der Cookie bereits gesetzt ist.

1

ich gefunden habe, dass Sie sich zurück in die Usermanager gehen und schauen sie auf:

var user = await UserManager.FindAsync(username, password); 
Verwandte Themen