Я работаю над. 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.
Обновленный вопрос:
Как мне добиться того же? Любые примеры кода будут полезны.