Реализация JWT-аутентификации в приложениях .NET для безопасного и масштабируемого решения.

В последние годы аутентификация на основе токенов становится все более популярной, предлагая более безопасное и масштабируемое решение, чем традиционная аутентификация на основе файлов cookie. Одним из наиболее широко распространенных методов аутентификации на основе токенов являются веб-токены JSON (JWT). В этом посте мы рассмотрим основы JWT и предоставим пошаговые инструкции по реализации JWT-аутентификации в ваших .NET-приложениях.
Что такое веб-токен JSON (JWT)?
Веб-токен JSON (JWT) — это открытый стандарт (RFC 7519), определяющий компактный, автономный способ безопасной передачи информации между сторонами в виде объекта JSON. JWT часто используются для целей аутентификации и авторизации, поскольку они могут быть подписаны с использованием секретного ключа или пары открытого/закрытого ключей.
JWT состоит из трех частей: заголовок, полезная нагрузка и подпись. Заголовок и полезные данные представляют собой строки JSON в кодировке Base64Url, которые соединяются с разделителем точки (.), а затем подписываются для создания подписи.
Настройка аутентификации JWT в .NET
Для реализации JWT-аутентификации в приложении .NET мы будем использовать пакет Microsoft.AspNetCore.Authentication.JwtBearer. Сначала установите пакет с помощью диспетчера пакетов NuGet:
Install-Package Microsoft.AspNetCore.Authentication.JwtBearer
Настройка аутентификации JWT в Startup.cs
В файле Startup.cs добавьте следующие операторы using:
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens;
Затем в методе ConfigureServices добавьте промежуточное ПО аутентификации JWT:
public void ConfigureServices(IServiceCollection services)
{
// ...
// Add JWT authentication
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 = Configuration["Jwt:Issuer"],
ValidAudience = Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"]))
};
});
// ...
}
В методе Configure добавьте промежуточное ПО аутентификации:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
app.UseAuthentication();
app.UseAuthorization();
// ...
}
Генерация и проверка токенов JWT
Чтобы сгенерировать токен JWT, создайте вспомогательный класс с именем JwtTokenGenerator:
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
public class JwtTokenGenerator
{
private readonly IConfiguration _configuration;
public JwtTokenGenerator(IConfiguration configuration)
{
_configuration = configuration;
}
public string GenerateToken(string username)
{
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, username),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var expires = DateTime.Now.AddDays(Convert.ToDouble(_configuration["Jwt:ExpirationInDays"]));
var token = new JwtSecurityToken(
_configuration["Jwt:Issuer"],
_configuration["Jwt:Audience"],
claims,
expires: expires,
signingCredentials: creds
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
Имея класс `JwtTokenGenerator`, вы теперь можете сгенерировать токен JWT для пользователя. Вот пример того, как создать токен, когда пользователь успешно входит в систему:
[HttpPost("login")]
public async Task<IActionResult> Login([FromBody] LoginModel model)
{
// Replace with your actual user validation logic
if (IsValidUser(model))
{
var tokenGenerator = new JwtTokenGenerator(Configuration);
var token = tokenGenerator.GenerateToken(model.Username);
return Ok(new { token });
}
return Unauthorized();
}
private bool IsValidUser(LoginModel model)
{
// Implement your user validation logic here
return true;
}
Когда пользователь делает запрос с действительным токеном JWT, промежуточное ПО JwtBearer проверяет токен, и вы можете получить доступ к утверждениям пользователя через свойство HttpContext.User.
Заключение
Реализация JWT-аутентификации в приложениях .NET — это безопасный и эффективный способ управления аутентификацией пользователей. Следуя шагам, описанным в этом посте, вы сможете создавать, проверять и управлять токенами JWT в своих проектах .NET. JWT предоставляет масштабируемое и автономное решение для безопасной передачи пользовательской информации, что делает его отличным выбором для современных веб-приложений.
Вы можете получить полный доступ ко всем историям на Medium всего за 5 долларов в месяц, зарегистрировавшись по этой ссылке.
Повышение уровня кодирования
Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:
- 👏 Хлопайте за историю и подписывайтесь на автора 👉
- 📰 Смотрите больше контента в публикации Level Up Coding
- 💰 Бесплатный курс собеседования по программированию ⇒ Просмотреть курс
- 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"
🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу