Как получить Identity User из его аутентификационного токена JWT в. Net Core API? - PullRequest
0 голосов
/ 28 февраля 2020

Я использую . Net Core для моего API, поэтому никаких представлений или чего-либо еще. Я также использую ASP. net Core Identity framework для авторизации пользователей в моей базе данных. Для входа в систему я использую этот код:

private string GenerateAuthenticationResult(ApplicationUser user)
        {
            var tokenHandler = new JwtSecurityTokenHandler();
            var key = Encoding.ASCII.GetBytes(_jwtSettings.Secret);
            var tokenDescriptor = new SecurityTokenDescriptor
            {
                // Things to be included and encoded in the token
                Subject = new ClaimsIdentity(new[]
                {
                    new Claim(JwtRegisteredClaimNames.Sub, user.Email),
                    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                    new Claim(JwtRegisteredClaimNames.Email, user.Email),
                    new Claim("id", user.Id)
                }),
                // Token will expire 2 hours from which it was created
                Expires = DateTime.UtcNow.AddHours(2),
                //
                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
            };

            var token = tokenHandler.CreateToken(tokenDescriptor);

            return tokenHandler.WriteToken(token);
        }

Это работает как брелок для аутентификации действий пользователя, но как я могу узнать, с кем разговаривает мой сервер, при условии, что пользователь использовал токен, который я предоставил ранее? для входа в свой заголовок запроса (Bearer).

TL; dr

Я хочу извлечь идентификатор пользователя или адрес электронной почты пользователя из токена, указанного в заголовке запроса.

Спасибо.

1 Ответ

1 голос
/ 28 февраля 2020

Вы можете использовать AddJwtBearer проверку токенов JWT:

var sharedKey = new SymmetricSecurityKey(
            Encoding.UTF8.GetBytes("yourkey"));
services.AddAuthentication(x =>
{
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x =>
{
    x.RequireHttpsMetadata = false;
    x.SaveToken = true;

    x.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = sharedKey,

        ValidateIssuer = false,
        ValidateAudience = false,
        ValidateLifetime = false,            
    };
});

и включить asp. net промежуточное ПО для аутентификации ядра с помощью добавления app.UseAuthentication(); в Configure метод. После этого вы можете добавить атрибут [Authorize] на защищенные действия / контроллеры.

Чтобы получить адрес электронной почты и идентификатор пользователя после аутентификации в действии:

var  email= User.Claims.Where(x => x.Type == ClaimTypes.Email).FirstOrDefault()?.Value;
var  userid= User.Claims.Where(x => x.Type == "id").FirstOrDefault()?.Value;

Здесь ClaimTypes.Email используется с JwtRegisteredClaimNames.Email будет автоматически сопоставляться с ClaimTypes.Email промежуточным ПО. См. исходный код .

Вот несколько полезных статей для аутентификации JWT:

https://jasonwatmore.com/post/2018/08/14/aspnet-core-21-jwt-authentication-tutorial-with-example-api

https://jasonwatmore.com/post/2019/10/11/aspnet-core-3-jwt-authentication-tutorial-with-example-api

...