Авторизация и аутентификация в C# (.NET): Полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Авторизация и аутентификация в 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.                    

Рекомендаций