如何將IdentityUser擴展為ASP.NET Core / MVC 6 / EF7中的聲明?

asp.net-core asp.net-core-mvc asp.net-identity entity-framework-core

我正在構建一個擁有屬於帳戶的用戶的站點。帳戶由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()並生成一個自定義用戶身份,如下所示: 如何擴展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;
}

如果您需要有關如何添加自定義聲明的幫助,請參閱此問題



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因