如何在ASP .NET CORE Identity中通过SignInManager登录后获取用户声明?

问题描述 投票:1回答:1

我有一个ASP .NET Core 2.0项目,我使用Microsoft的Identity框架进行身份验证/授权。我有以下方法验证用户对用户名和密码并返回索赔计数。我尝试登录的用户可以在数据库中找到,但它的声明在这里返回0 - 在数据库中,对用户存在声明(请参阅imageenter image description here)。

    [HttpPost("login")]
    public async Task<object> Login([FromBody] LoginDto model)
    {
        var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, false, false);

        if (result.Succeeded)
        {
            var appUser = _signInManager.UserManager.Users.SingleOrDefault(r => r.Email == model.Email);
            var userClaims = await _signInManager.UserManager.GetClaimsAsync(appUser); // this is returning 0 claims

            return Ok(HttpContext.User.Claims.Count());
        }

       throw new ApplicationException("INVALID_LOGIN_ATTEMPT");
    }

关于可能的重复问题的答案并没有解决我的问题。

c# asp.net-core asp.net-identity claims-based-identity
1个回答
1
投票

对于UserManager.GetClaimsAsync,它将查询来自AspNetUserClaims而不是AspNetUserRoles的索赔。你可以通过GetClaimsAsync查看这个

return await UserClaims.Where(uc => uc.UserId.Equals(user.Id)).Select(c => c.ToClaim()).ToListAsync(cancellationToken);

通常,我们可以尝试使用HttpContext.User.Claims来检索用户的声明,但它可以用于子请求而不是当前的登录请求。如果你将这个HttpContext.User.Claims移动到Home Index动作,它将返回预期的结果。

为了获得Login的索赔,我建议你试试

                var claimsPrincipal = await _signInManager.CreateUserPrincipalAsync(appUser);
                var claims = claimsPrincipal.Claims.ToList();
© www.soinside.com 2019 - 2024. All rights reserved.