2014-11-04 8 views
35

Sono relativamente nuovo ad ASP.Net MVC e cerco di utilizzare ora la funzionalità di accesso utente integrata. Sono in grado di registrare un utente nella vista di registrazione. Se provo ad accedere con l'utente creato, funziona anche questo. Sono reindirizzato alla pagina principale.Ottieni ID utente dell'utente che ha effettuato l'accesso in Asp.Net MVC 5

Ma non riesco a ottenere l'ID utente dell'utente corrente. Ho provato il mio codice nel HomeController e nel AccountController, ma entrambi non hanno funzionato. L'istruzione nella prima riga restituisce sempre 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()); 
} 

Devo fare qualcos'altro prima di ottenere l'ID utente?

risposta

45

La risposta è proprio lì nel tuo codice. Cosa restituisce questo?

var userID = User.Identity.GetUserId(); 

Se si utilizza ASP.NET Identità, quindi dopo registrazione a (e reindirizzamento a un'altra pagina), il IPrincipal.IIdentity dovrebbe essere un ClaimsIdentity. Si può provare questo:

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; 
    } 
} 

Il blocco di codice di cui sopra non è esattamente, ma in sostanza, ciò che il metodo IIdentity.GetUserId estensione fa.

Se nessuna di queste funzioni, l'utente non può ancora accedere al tuo sito. Dopo aver effettuato l'accesso, è necessario reindirizzare a un'altra pagina prima che il server scriva il cookie di autenticazione al browser. Questo cookie deve essere scritto prima che lo User.Identity contenga tutte queste informazioni sui reclami (incluso lo NameIdentifier) sulle richieste successive.

+1

Scusa, non è chiaro nella mia domanda, lo cambierò. L'affermazione sopra restituisce null. –

+2

Se 'User.Identity.GetUserId()' restituisce null, significa che l'utente * non * ha effettuato l'accesso. Assicurati che qualsiasi azione in cui stai chiamando sia decorata con '[Authorize]', per far sì che sia loggato solo gli utenti possono arrivarci. Chiunque non abbia effettuato l'accesso verrà inviato automaticamente alla tua pagina di accesso. –

+1

Grazie per la risposta. Il suggerimento che devo reindirizzare a un'altra pagina prima che questo funzioni ha aiutato. –

Problemi correlati