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

时间:2016-04-24 00:50:53

标签: asp.net-core asp.net-identity asp.net-core-mvc entity-framework-core

我正在构建一个拥有属于某个帐户的用户的网站。该帐户由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 个答案:

答案 0 :(得分:0)

如果您添加了对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