Вот моя настройка - Генерация токена JWT:
Код: Выделить всё
public async Task GenerateJWTTokenAsync(AppUser user)
{
var claims = new List
{
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Name, user.UserName.ToString())
};
if (user.IsSuperAdmin)
{
claims.Add(new Claim("isSuperAdmin", "true"));
}
var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Jwt:SecretKey"]));
var token = new JwtSecurityToken(
issuer: configuration["Jwt:Issuer"],
audience: configuration["Jwt:Audience"],
claims: claims,
expires: DateTime.UtcNow.AddMinutes(15),
signingCredentials: new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256)
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
Код: Выделить всё
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],
ValidAudience = builder.Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:SecretKey"])),
ClockSkew = TimeSpan.Zero
};
});
Код: Выделить всё
public async Task InvokeAsync(HttpContext context)
{
if (context.Request.Headers.TryGetValue("Authorization", out var token))
{
Console.WriteLine($"Token: {token}");
}
if (context.User.Identity.IsAuthenticated)
{
Console.WriteLine($"User Authenticated: {context.User.Identity.Name}");
}
else
{
Console.WriteLine("User is not authenticated");
}
await _next(context);
}
- Я получаю токен в заголовке авторизации< /li>
Несмотря на это, HttpContext.User пуст, а IsAuthenticated всегда имеет значение false.
- Проверил порядок промежуточного программного обеспечения (и UseAuthorization предшествуют моему пользовательскому промежуточному программному обеспечению)
Код: Выделить всё
UseAuthentication
- Проверил формат заголовка авторизации ()
Код: Выделить всё
Bearer
- Включено подробное ведение журнала для JwtBearerMiddleware, но ошибки не регистрируются.
- Токен проверен вручную с помощью JwtSecurityTokenHandler.ReadJwtToken. () в промежуточном программном обеспечении, и кажется действительным
- Гарантированные параметры TokenValidationParameters соответствуют свойства токена (Эмитент, Аудитория, SecretKey и т. д.)
Подробнее здесь: https://stackoverflow.com/questions/792 ... -user-is-e