Sto costruendo un sito che ha utenti che appartengono a un account. L'account è identificato da un AccountId che è una chiave esterna per la maggior parte dei dati nel DB come Addebiti (associati ad un Conto) o Ricevute (associati ad un Conto).
Anziché colpire il DB ogni volta che il repository deve essere interrogato per ottenere i dati per ottenere l'ID dell'account dell'utente, ho voluto aggiungere l'ID account come reclamo. L'obiettivo è di fare qualcosa come:
_repository.GetAllChargesByAccountId(User.Identity.GetAccountId());
Sto trovando solo elementi e soluzioni parziali per questo e non sono stato in grado di risolvere alcune differenze tra questi esempi e il mio ambiente specifico (ASP.NET Core RC1, MVC 6, EF7).
Ho derivato una classe da IdentityUser per l'aggiunta di attributi sull'utente:
public class UserIdentity : IdentityUser {
public static object Identity { get; internal set; }
public int AccountId { get; set; }
}
Ho creato un UserIdentityContext che deriva da IdentityDbContext che sto usando per il mio negozio utente EF.
E ho il seguente AuthController:
public class AuthController : Controller {
private SignInManager<UserIdentity> _signInManager;
public AuthController(SignInManager<UserIdentity> signInManager) {
_signInManager = signInManager;
}
public IActionResult Login() {
if (User.Identity.IsAuthenticated)
return RedirectToAction("Dashboard", "App");
return View();
}
[HttpPost]
public async Task<ActionResult> Login(LoginViewModel vm, string returnUrl) {
if (ModelState.IsValid) {
var signInResult = await _signInManager.PasswordSignInAsync(vm.Username, vm.Password, true, false);
if (signInResult.Succeeded) {
if (String.IsNullOrWhiteSpace(returnUrl))
return RedirectToAction("Dashboard", "App");
else return RedirectToAction(returnUrl);
} else {
ModelState.AddModelError("", "Username or password is incorrect.");
}
}
return View();
}
public async Task<IActionResult> Logout() {
if (User.Identity.IsAuthenticated) {
await _signInManager.SignOutAsync();
}
return RedirectToAction("Index", "App");
}
}
Guardando altri post, sembra che ho bisogno di aggiungere un IdentityExtension per accedere al claim come User.Identity.GetAccountId () e generare un'identità utente personalizzata come in questa risposta: Come estendere le proprietà disponibili di User.Identity ma ovviamente questo viene fatto in una versione precedente e molte delle chiamate al metodo non sono più applicabili.
Grazie in anticipo per eventuali risposte o indicazioni.
se hai aggiunto un reclamo per AccountId puoi quindi facilmente scrivere un metodo di estensione per ottenerlo:
public static string GetAccountId(this ClaimsPrincipal principal)
{
if (principal == null)
{
throw new ArgumentNullException(nameof(principal));
}
var claim = principal.FindFirst("AccountId");
return claim != null ? claim.Value : null;
}
se hai bisogno di aiuto su come aggiungere un reclamo personalizzato vedi questa domanda