【发布时间】:2016-08-17 12:25:03
【问题描述】:
我正在构建一个包含属于某个帐户的用户的网站。帐户由 AccountId 标识,它是数据库中大多数数据的外键,例如 Charges(与帐户相关联)或 Receipts(与帐户相关联)。
每次需要轮询存储库以获取数据以获取用户的 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; }
}
我创建了一个派生自我用于我的 EF 用户存储的 IdentityDbContext 的 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");
}
}
查看其他帖子,听起来我需要添加一个 IdentityExtension 才能以 User.Identity.GetAccountId() 的身份访问声明并生成自定义用户身份,如此答案:How to extend available properties of User.Identity 但显然已经完成在旧版本中,许多方法调用不再适用。
提前感谢您的任何回答或指导。
【问题讨论】:
-
似乎和这个问题很相似stackoverflow.com/questions/36496135/…
标签: asp.net-core asp.net-identity asp.net-core-mvc entity-framework-core