Реализация 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 и найдите прекрасную работу