Заявки JWT отсутствуют в HttpContext.User.Claims - PullRequest
0 голосов
/ 02 февраля 2020

Я создаю токен JWT. NET Ядро 3.1, содержащее некоторые пользовательские утверждения, например

var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration.Security.Jwt.SecretKey));
var claims = new[]
{
    new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
    new Claim(CustomClaimTypes.TenantId, user.TenantId.ToString()),
    new Claim(JwtRegisteredClaimNames.Sub, user.Email),
    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
    new Claim(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToUnixEpochDate().ToString(), ClaimValueTypes.Integer64)
};

var jwt = new JwtSecurityToken(
    issuer: Configuration.Security.Jwt.Issuer,
    audience: Configuration.Security.Jwt.Audience,
    claims: claims,
    notBefore: DateTime.UtcNow,
    expires: DateTime.UtcNow.Add(Configuration.Security.Jwt.Expiration),
    signingCredentials: new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256)
);

var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);

И я настраиваю JWT в Startup.cs следующим образом:

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    options.SaveToken = true;
    options.ClaimsIssuer = Configuration.Security.Jwt.Issuer;
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        RequireExpirationTime = false,
        ValidateIssuerSigningKey = true,
        ValidIssuer = Configuration.Security.Jwt.Issuer,
        ValidAudience = Configuration.Security.Jwt.Audience,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration.Security.Jwt.SecretKey)),
        ClockSkew = TimeSpan.Zero 
    };
});

Но когда я пытаюсь получить доступ к претензиям через IHttpContextAccessor.HttpContext.User.Claims. Я вижу только:

[0] = {http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier: b88ac068-9d05-4287-94e1-103ba86fd974}
[1] = {http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name: demo@demo.com}
[2] = {AspNet.Identity.SecurityStamp: TYI7T2BMGQWQUIFXKVBARPWADTFJ7CEH}
[3] = {amr: pwd}

Кажется, что нормальная аутентификация работает нормально, я могу получить доступ к действиям, которые я украсил [Authorize], просто появляются пользовательские утверждения.

...