Сохраните ключ подписи, используя Data Protection API - PullRequest
0 голосов
/ 06 марта 2020

Я работаю над. Net Core Web API, в котором мы используем Jwt Token для авторизации веб-запросов. Ниже приведен код для генерации токена и его настройки при запуске.

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateAudience = false,
        ValidateIssuer = false,
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Security:Key"])),
        ValidateLifetime = true,
        ClockSkew = TimeSpan.FromMinutes(5)
    };
});

Генерация токена:

private string GenerateToken(string username)
{
    var claims = new[]
    {
        new Claim(ClaimTypes.Name, username),
        new Claim(JwtRegisteredClaimNames.Nbf, new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds().ToString()),
        new Claim(JwtRegisteredClaimNames.Exp, new DateTimeOffset(DateTime.Now.AddDays(1)).ToUnixTimeSeconds().ToString()),
        new Claim(ClaimTypes.Role, "PB"),
        new Claim(ClaimTypes.Version, _configuration["Version"]),
    };

    var token = new JwtSecurityToken(
        new JwtHeader(new SigningCredentials(
            new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Security:Key"])),
            SecurityAlgorithms.HmacSha256)),
        new JwtPayload(claims));

    return new JwtSecurityTokenHandler().WriteToken(token);
}

Это работает, как и ожидалось. Недавно мы получили предложение, что вместо использования _configuration["Security:Key"] жестко закодированного секретного ключа для подписи токена, используйте Data Protection API . После просмотра документации у меня возникли следующие вопросы:

  • Как объединить подпись токена JWT с API защиты данных?
  • Нужно ли использовать ключи от DPAPI для подписи токена или Использовать метод защиты и снятия защиты DPAPI для отправки зашифрованного токена в ответ?
  • Я не могу найти способ зашифровать токен с помощью DPAPI. Возможно ли это вообще?
  • Полезно ли извлекать мастер-ключ / или любой ключ из DPAPI для подписи токена?

Есть предложения?

Наша цель - избавиться от секретного ключа на основе конфигурации и использовать DPAPI.

Редактировать:

Как упомянуто @jps в разделе комментариев, в этом случае мы должны сохранить пение ключа с помощью DPAPI.

Обновленный вопрос:

Как мне добиться того же? Любые примеры кода будут полезны.

...