我正在构建一个拥有属于某个帐户的用户的网站。该帐户由AccountId标识,该帐户是数据库中大多数数据的外键,如收费(与帐户关联)或收据(与帐户关联)。如何扩展IdentityUser作为ASP.NET Core/MVC 6/EF7中的声明?
每次存储库需要轮询数据以获取用户的AccountId时,我都不想打数据库,而是希望将AccountId添加为索赔。我们的目标是做这样的事情:
_repository.GetAllChargesByAccountId(User.Identity.GetAccountId());
我发现只有花絮和部分解决方案,这和我没有能够解决这些例子和我的特定环境(ASP.NET核心RC1之间存在一些差异,MVC 6,EF7)。
我都来源于IdentityUser类添加有关用户属性:
public class UserIdentity : IdentityUser {
public static object Identity { get; internal set; }
public int AccountId { get; set; }
}
我创建了从IdentityDbContext得出结论说我用我的EF用户存储一个UserIdentityContext。
而且我有以下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");
}
}
观看其他文章,这听起来像我需要为访问索赔User.Identity.GetAccountId(添加IdentityExtension),并生成自定义用户身份在这个答案:How to extend available properties of User.Identity但显然这是在一个较旧的版本和许多方法调用不适用了。
在此先感谢您的任何答案或指导。
帮助似乎很相似到这个问题http://stackoverflow.com/questions/36496135/store-custom-datas-in-identity-cookie/36498357#36498357 –