Ci sono un sacco di risposte diverse che fluttuano qui intorno per i diversi RC di ASP.NET Core su come ottenere l'ID dell'utente attualmente connesso. Volevo porre la domanda definitiva qui. Si noti che project.json ora ha "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0"
Con RC1, puoi fare qualcosa del genere:
using Microsoft.AspNet.Identity;
using System.Security.Claims;
User.GetUserId();
Ma con la nuova versione 1 di EF Core, Microsoft.AspNet.Identity non è la versione giusta.
C'erano suggerimenti per usare UserManager, che sembra molto utile solo per ottenere l'utente attualmente connesso:
private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);
var user = await GetCurrentUserAsync();
var userId = user?.Id;
Un altro metodo che ho trovato è stato:
private readonly UserManager<ApplicationUser> _userManager;
_userManager.GetUserId(User)
Quindi con ASP.NET Core 1 RTM e EF Core 1 con le seguenti librerie in project.json, qual è il modo corretto per ottenere l'id dell'utente attualmente connesso?
"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0",
"Microsoft.AspNetCore.Mvc": "1.0.0",
ASP.NET Core Identity viene iniettato tramite DI in startup.cs - come tale è sufficiente iniettare UserManager tramite un costruttore
UserManager<ApplicationUser> userManager
È quindi possibile utilizzare il seguente metodo
_userManager.GetUserId(User);
Questo è il modo in cui viene utilizzato nell'applicazione Web di esempio quando si crea un nuovo progetto ASP.NET Core 1 con un account utente individuale.
Se si accede a questo da withing il Controller, quindi utilizzando UserManager per ottenere l'ID utente è piuttosto inefficiente come si sta facendo un giro al database. Se stai utilizzando ClaimsIdentity , puoi fare qualcosa di simile per ottenere l'id utente:
var claimsIdentity = (ClaimsIdentity)this.User.Identity;
var claim = claimsIdentity.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier);
var userId = claim.Value;
Questo metodo legge semplicemente l'ID utente già presente nel cookie, che a sua volta viene automaticamente deserializzato e archiviato in un'istanza di ClaimsIdentity .
Io uso questa classe di aiuto:
public static class UserHelpers
{
public static string GetUserId(this IPrincipal principal)
{
var claimsIdentity = (ClaimsIdentity)principal.Identity;
var claim = claimsIdentity.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier);
return claim.Value;
}
}
Quindi ottenere un ID utente diventa:
var userId = this.User.GetUserId();
Se, per qualche motivo, la richiesta richiesta non è presente nella raccolta dei reclami , è possibile aggiungerla facilmente durante la creazione di ClaimsIdentity dell'utente:
public class ApplicaionUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
userIdentity.AddClaim(new Claim(ClaimTypes.NameIdentifier, this.UserId));
return userIdentity;
}
}