ASP.NET Core Identity - get current user

前端 未结 7 666
灰色年华
灰色年华 2020-12-07 11:48

To get the currently logged in user in MVC5, all we had to do was:

using Microsoft.AspNet.Identity;
[Authorize]
public IHttpActionResult DoSomething() {
             


        
7条回答
  •  太阳男子
    2020-12-07 12:49

    Just if any one is interested this worked for me. I have a custom Identity which uses int for a primary key so I overrode the GetUserAsync method

    Override GetUserAsync

    public override Task GetUserAsync(ClaimsPrincipal principal)
    {
        var userId = GetUserId(principal);
        return FindByNameAsync(userId);
    }
    

    Get Identity User

    var user = await _userManager.GetUserAsync(User);
    

    If you are using a regular Guid primary key you don't need to override GetUserAsync. This is all assuming that you token is configured correctly.

    public async Task GenerateTokenAsync(string email)
    {
        var user = await _userManager.FindByEmailAsync(email);
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes(_tokenProviderOptions.SecretKey);
    
        var userRoles = await _userManager.GetRolesAsync(user);
        var roles = userRoles.Select(o => new Claim(ClaimTypes.Role, o));
    
        var claims = new[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
            new Claim(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString(CultureInfo.CurrentCulture)),
            new Claim(JwtRegisteredClaimNames.GivenName, user.FirstName),
            new Claim(JwtRegisteredClaimNames.FamilyName, user.LastName),
            new Claim(JwtRegisteredClaimNames.Email, user.Email),
        }
        .Union(roles);
    
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(claims),
            Expires = DateTime.UtcNow.AddHours(_tokenProviderOptions.Expires),
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        };
    
        var token = tokenHandler.CreateToken(tokenDescriptor);
    
        return Task.FromResult(new JwtSecurityTokenHandler().WriteToken(token)).Result;
    }
    

提交回复
热议问题