我正在构建一个拥有属于帐户的用户的站点 . 该帐户由AccountId标识,AccountId是数据库中大多数数据的外键,例如费用(与帐户相关联)或收据(与帐户相关联) .
每次需要轮询数据库以获取用户的AccountId时,我不想点击数据库,而是想将AccountId添加为声明 . 目标是做一些事情:
_repository.GetAllChargesByAccountId(User.Identity.GetAccountId());
我发现只有花絮和部分解决方案,我无法解决这些示例和我的特定环境(ASP.NET Core RC1,MVC 6,EF7)之间的一些差异 .
我从IdentityUser派生了一个类来添加有关用户的属性:
public class UserIdentity : IdentityUser {
public static object Identity { get; internal set; }
public int AccountId { get; set; }
}
我创建了一个UserIdentityContext,它派生自我用于EF用户存储的IdentityDbContext .
我有以下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");
}
}
看看其他帖子,听起来我需要添加一个IdentityExtension才能以User.Identity.GetAccountId()的形式访问声明并生成一个自定义用户身份,如下所示:How to extend available properties of User.Identity但显然这是在旧版本中完成的许多方法调用不再适用 .
提前感谢您的任何答案或指导 .
1 回答
如果您已为AccountId添加了声明,则可以轻松编写扩展方法来获取它:
如果您需要有关如何添加自定义声明的帮助,请参阅this question