2015-05-24 10 views
5

Próbuję użyć rozwiązania tożsamości MVC 5, ale utknąłem na czymś, co powinno być bardzo proste: Chcę metodę logowania na AccountController do pobierz nazwę zalogowanego użytkownika zaraz po sprawdzeniu poprawności modelu (i nie chcę go używać z modelu!).Korzystając z tożsamości MVC 5, nie mogę uzyskać nazwy użytkownika zaraz po zalogowaniu

Oto fragment mojego kodu:

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 
} 

Problem, że dostaję to, że ta właściwość ma wartość null.

Po wielu testach zdałem sobie sprawę, że jest coś dziwnego: jeśli dwukrotnie uwierzytelnię, w drugim przejściu zadziała. Ale za każdym razem, gdy się wyloguję i spróbuję ponownie zalogować, otrzyma on pustą nazwę użytkownika.

Jakąkolwiek pomoc w tym, co jest nie tak?

+0

Jak odpowiedział, że nie może uzyskać dostępu do roszczeń, ani tożsamość tym momencie w tym procesie. Jednak na tym etapie prawdopodobnie czytałeś użytkownika z DB, więc prawdopodobnie masz już potrzebne informacje. –

+0

Zapoznaj się z moją odpowiedzią na pytanie, jak szybko uzyskać tożsamość i wszelkie roszczenia przechowywane w bazie danych, bez konieczności ponownej wizyty w bazie danych po pomyślnym zalogowaniu. –

Odpowiedz

7

Na końcu łańcucha wykonawczego SignInManager.PasswordSignInAsync metoda wywołuje metodę SignInAsync, która jest zasadniczo odpowiedzialna za ustawienie pliku cookie uwierzytelniającego zawierającego wiele stwierdzeń dotyczących użytkownika (jednym z nich jest jego nazwa). Powodem, dla którego nie można użyć numeru User.Identity.Name w tym samym wywołaniu z numerem SignInManager.PasswordSignInAsync, jest to, że User.Identity wypełniono roszczeniami z pliku cookie uwierzytelniającego (które nie zostały jeszcze przeanalizowane). Powodem, że działa na drugim przebiegu jest to, że plik cookie jest tam i User.Identity jest poprawnie wypełniony. W większości przypadków po pomyślnym logowaniu następuje przekierowanie do strony. Wewnątrz tego działania przekierowania będziesz mógł używać User.Identity, ponieważ plik cookie jest już ustawiony.

1

Znalazłem można przejść z powrotem do UserManager i wyszukać je:

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