2014-11-04 35 views
35

Jestem stosunkowo nowy w ASP.Net MVC i próbuję teraz użyć wbudowanej funkcji logowania użytkownika. Mogę zarejestrować użytkownika w widoku rejestracji. Jeśli spróbuję zalogować się z utworzonym użytkownikiem, to również działa. Jestem przekierowywany na stronę wzorcową.Uzyskaj identyfikator użytkownika zalogowanego użytkownika w Asp.Net MVC 5

Nie mogę jednak uzyskać identyfikatora użytkownika bieżącego użytkownika. Próbowałem mojego kodu w HomeController i AccountController, ale oba nie działa. Instrukcja w pierwszym wierszu zwraca zawsze wartość null.

var userID = User.Identity.GetUserId(); 

if (!string.IsNullOrEmpty(userID)) 
{ 
    var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(ApplicationDbContext.Create())); 
    var currentUser = manager.FindById(User.Identity.GetUserId()); 
} 

Czy muszę uzyskać coś innego przed uzyskaniem identyfikatora użytkownika?

Odpowiedz

45

Odpowiedź jest właśnie w twoim kodzie. Co to oznacza?

var userID = User.Identity.GetUserId(); 

Jeśli używasz Tożsamość ASP.NET, następnie po zalogowaniu (i przekierowanie do innej strony), przy czym IPrincipal.IIdentity powinny być ClaimsIdentity. Można spróbować to:

var claimsIdentity = User.Identity as ClaimsIdentity; 
if (claimsIdentity != null) 
{ 
    // the principal identity is a claims identity. 
    // now we need to find the NameIdentifier claim 
    var userIdClaim = claimsIdentity.Claims 
     .FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier); 

    if (userIdClaim != null) 
    { 
     var userIdValue = userIdClaim.Value; 
    } 
} 

Powyższy fragment kodu nie jest dokładnie, ale przede wszystkim, co czyni metodę IIdentity.GetUserId rozszerzenie.

Jeśli nic z tego nie działa, użytkownik może nie być jeszcze zalogowany na stronie. Po zalogowaniu musisz przekierować na inną stronę, zanim serwer zapisze plik cookie uwierzytelniający w przeglądarce. Ten plik cookie musi zostać napisany przed User.Identity ma wszystkie te informacje roszczeń (w tym NameIdentifier) na kolejnych żądań.

+1

Niestety, nie było jasne w moim pytaniu, zmienię to. Powyższe polecenie zwraca wartość null. –

+2

Jeśli 'User.Identity.GetUserId()' zwróci wartość null, oznacza to, że użytkownik nie jest * zalogowany *. Upewnij się, że jakiekolwiek działanie, do którego to wywołujesz zostało ozdobione '[Autoryzuj]', aby wymusić tylko zalogowane. użytkownicy mogą się do niego dostać. Każdy, kto nie jest zalogowany, zostanie automatycznie wysłany na twoją stronę logowania. –

+1

Dziękuję za odpowiedź. Wskazówka, że ​​muszę przekierować do innej strony, zanim to działa, pomogła. –

Powiązane problemy