Авторизация и аутентификация в C# (.NET): Полное руководство
Безопасность веб-приложений — краеугольный камень современной разработки. В экосистеме C# (.NET) встроенные механизмы аутентификации и авторизации позволяют гибко и надежно защитить ваше приложение. В этой статье мы разберем ключевые концепции, инструменты и примеры кода для работы с Identity, JWT и ролевой моделью.
1. Основные понятия
Прежде чем перейти к коду, важно разграничить два термина:
- Аутентификация — процесс проверки подлинности пользователя (кто вы?). Обычно выполняется через логин/пароль, токены или внешние провайдеры.
- Авторизация — процесс определения прав доступа (что вам можно делать?). Реализуется через роли, политики или claims.
2. ASP.NET Core Identity — встроенное решение
Microsoft.AspNetCore.Identity — это полноценная система управления пользователями, которая включает регистрацию, вход, сброс пароля, двухфакторную аутентификацию и многое другое. Она работает с Entity Framework Core и поддерживает любые хранилища данных.
Установка:
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
Пример регистрации пользователя (контроллер Account):
public class AccountController : Controller
{
private readonly UserManager<IdentityUser> _userManager;
private readonly SignInManager<IdentityUser> _signInManager;
public AccountController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager)
{
_userManager = userManager;
_signInManager = signInManager;
}
[HttpPost]
public async Task<IActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new IdentityUser { UserName = model.Email, Email = model.Email };
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await _signInManager.SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "Home");
}
foreach (var error in result.Errors)
ModelState.AddModelError(string.Empty, error.Description);
}
return View(model);
}
}
3. JWT (JSON Web Tokens) — бесстатусная аутентификация
Для современных SPA (React, Angular) или мобильных приложений часто используют JWT. Токен подписывается сервером и содержит claims (утверждения) о пользователе. Сервер не хранит сессии, что упрощает масштабирование.
Настройка в Program.cs:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],
ValidateAudience = true,
ValidAudience = builder.Configuration["Jwt:Audience"],
ValidateLifetime = true,
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
};
});
Генерация токена:
public string GenerateToken(IdentityUser user)
{
var claims = new[]
{
new Claim(ClaimTypes.NameIdentifier, user.Id),
new Claim(ClaimTypes.Email, user.Email),
new Claim(ClaimTypes.Role, "User")
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: _configuration["Jwt:Issuer"],
audience: _configuration["Jwt:Audience"],
claims: claims,
expires: DateTime.Now.AddHours(1),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
4. Cookie-аутентификация
Для классических серверных приложений (MVC, Razor Pages) проще использовать куки. Identity автоматически их настраивает, но вы можете сделать это вручную:
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Account/Login";
options.AccessDeniedPath = "/Account/AccessDenied";
options.ExpireTimeSpan = TimeSpan.FromDays(7);
options.SlidingExpiration = true;
});
5. Авторизация: роли и политики
После аутентификации нужно ограничить доступ. В .NET это делается через атрибуты [Authorize] и кастомные политики.
Ролевая авторизация:
[Authorize(Roles = "Admin")]
public IActionResult AdminPanel() => View();
Политики на основе claims:
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("MustBeAdult", policy =>
policy. Также в библиотеке
GraphQL библиотека JavaScript (Node.js): Полное руководство по Apollo Server и инструментам
Работа с CSV в Java: библиотеки OpenCSV и Apache Commons CSV
Работа с изображениями в Go (Golang): библиотеки и примеры