JWT в ядре .net - должны ли 'ValidIssuer' и 'ValidAudience' в TokenValidationParameters соответствовать сгенерированному токену? - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь настроить и понять 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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...