gpt4 book ai didi

asp.net-core - 如何将 IdentityUser 扩展为 ASP.NET Core/MVC 6/EF7 中的声明?

转载 作者:行者123 更新时间:2023-12-05 07:49:54 25 4
gpt4 key购买 nike

我正在构建一个网站,该网站的用户属于一个帐户。帐户由 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,它派生 self 用于我的 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但显然这是在旧版本中完成的,许多方法调用不再适用。

提前感谢您的任何回答或指导。

最佳答案

如果您已经为 AccountId 添加了一个声明,那么您可以轻松地编写一个扩展方法来获取它:

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;
}

如果您需要有关如何添加自定义声明的帮助,请参阅 this question

关于asp.net-core - 如何将 IdentityUser 扩展为 ASP.NET Core/MVC 6/EF7 中的声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36818097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com