Я создаю токен 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]
, просто появляются пользовательские утверждения.