Я пытаюсь настроить и понять JWT в моем приложении .net core 2.1, но одна часть меня запутала.
У меня есть следующие настройки в моем startup.cs
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.SaveToken = true;
options.ClaimsIssuer = Configuration["Authentication:JwtIssuer"];
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = "John",
ValidateAudience = true,
ValidAudience = "Dave",
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes
(Configuration["Authentication:JwtKey"])),
RequireExpirationTime = true,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
});
Я специально поставил странные значения для ValidIssuer
и ValidAudience
.
Генерация моего токена выглядит следующим образом ...
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Authentication:JwtKey"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var expires = DateTime.Now.AddDays(Convert.ToDouble(_configuration["Authentication:JwtExpireDays"]));
var token = new JwtSecurityToken(
issuer: _configuration["Authentication:JwtIssuer"],
audience: _configuration["Authentication:JwtAudience"],
claims: claims,
expires: expires,
signingCredentials: creds);
return new TokenViewModel
{
AccessToken = new JwtSecurityTokenHandler().WriteToken(token),
AccessTokenExpiration = expires,
FirstName = user.FirstName,
LastName = user.LastName
};
Здесь я устанавливаю issuer
и audience
для соответствующих значений в файле appsettings.json
.
Я думал, что ValidIssuer
и ValidAudience
из моего startup.cs
должны совпадать с issuer
и audience
в моем сгенерированном токене, однако, похоже, это не так. Вызовы к конечной точке с [Authorize]
работают, как ожидается, если токен предоставлен.
Почему это все еще работает? Разве это не проверка правильных данных об эмитенте и аудитории?
EDIT
Пример токена, сгенерированного моей конечной точкой токена ...
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJzdHVAcmF0Y2xpZmZlLmlvIiwianRpIjoiZWQyNmU0MjgtNjA3Yy00ZjZlLTg3ZjUtNjM1ZTU3MWQzNzQyIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZWlkZW50aWZpZXIiOiIxIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6InN0dUByYXRjbGlmZmUuaW8iLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJBZG1pbiIsImV4cCI6MTU1OTgzNDU2NiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIn0.CES0g8UCC8LArDkd8Q4s4a6mhXbkZVGiy3-hJ2Z0IqI
Decoded имеет следующую полезную нагрузку ...
{
"sub": "stu@ratcliffe.io",
"jti": "ed26e428-607c-4f6e-87f5-635e571d3742",
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier": "1",
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name": "stu@ratcliffe.io",
"http://schemas.microsoft.com/ws/2008/06/identity/claims/role": "Admin",
"exp": 1559834566,
"iss": "http://localhost:5000",
"aud": "http://localhost:5000"
}
Нет проблем с использованием этого токена для запроса авторизованной конечной точки, даже если мой издатель и аудитория http://localhost:5000 в токене не соответствуют моему издателю John и аудитории Dave в моем startup.cs