← Назад к вопросам

Как добавить авторизацию в приложение?

2.0 Middle🔥 121 комментариев
#Аутентификация и безопасность

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Подходы к реализации авторизации в приложении

Добавление авторизации — комплексная задача, включающая аутентификацию (проверка личности) и авторизацию (определение прав доступа). Для C# Backend приложений существует несколько основных подходов, выбор которых зависит от требований безопасности, архитектуры и масштаба приложения.

1. Cookie-аутентификация (традиционный подход)

Используется в монолитных веб-приложениях (ASP.NET MVC, Razor Pages). Сессия хранится на сервере, а идентификатор — в cookie браузера.

// Настройка в Program.cs
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.LoginPath = "/Account/Login";
        options.AccessDeniedPath = "/Account/AccessDenied";
        options.ExpireTimeSpan = TimeSpan.FromDays(7);
    });

// Защита контроллера/действия
[Authorize]
public class DashboardController : Controller
{
    // Только аутентифицированные пользователи
}

2. JWT (JSON Web Tokens) — для REST API и SPA

Современный подход для микросервисов и отдельного фронтенда. Токен содержит закодированные данные пользователя и подписывается сервером.

// Настройка JWT
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"])),
            ValidateIssuerSigningKey = true,
        };
    });

// Генерация токена
public string GenerateJwtToken(User user)
{
    var claims = new[]
    {
        new Claim(JwtRegisteredClaimNames.Sub, user.Id),
        new Claim(JwtRegisteredClaimNames.Email, user.Email),
        new Claim(ClaimTypes.Role, user.Role)
    };
    
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    
    var token = new JwtSecurityToken(
        issuer: _config["Jwt:Issuer"],
        audience: _config["Jwt:Audience"],
        claims: claims,
        expires: DateTime.UtcNow.AddHours(2),
        signingCredentials: creds);
        
    return new JwtSecurityTokenHandler().WriteToken(token);
}

3. OAuth 2.0 / OpenID Connect — для сторонних провайдеров

Позволяет использовать аккаунты Google, Microsoft, Facebook и других провайдеров.

// Настройка Google OAuth
builder.Services.AddAuthentication()
    .AddGoogle(options =>
    {
        options.ClientId = builder.Configuration["Google:ClientId"];
        options.ClientSecret = builder.Configuration["Google:ClientSecret"];
        options.CallbackPath = "/signin-google";
    });

4. Identity Framework — готовая система ASP.NET Core

Полноценное решение с поддержкой пользователей, ролей, двухфакторной аутентификации и восстановления пароля.

// Регистрация Identity
builder.Services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

// Контроллер регистрации
[HttpPost]
public async Task<IActionResult> Register(RegisterViewModel model)
{
    var user = new ApplicationUser { 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);
}

5. Политики авторизации на основе Claims и Roles

Гибкая система для контроля доступа с различными уровнями детализации.

// Настройка политик
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("RequireAdmin", policy => 
        policy.RequireRole("Admin"));
        
    options.AddPolicy("MinimumAge", policy =>
        policy.RequireClaim("DateOfBirth")
              .RequireAssertion(context =>
                  DateTime.Parse(context.User.FindFirstValue("DateOfBirth")) 
                      <= DateTime.Now.AddYears(-18)));
});

// Использование
[Authorize(Policy = "RequireAdmin")]
public class AdminController : Controller
{
    [Authorize(Policy = "MinimumAge")]
    public IActionResult RestrictedAction() => View();
}

Ключевые компоненты системы авторизации

  • Хранилище пользователей: База данных с таблицами пользователей, ролей и их связей
  • Механизм аутентификации: Процесс проверки учетных данных (пароль, токен, сертификат)
  • Сервис авторизации: Определение прав доступа к ресурсам
  • Промежуточное ПО (Middleware): app.UseAuthentication() и app.UseAuthorization() в конвейере запросов
  • Шифрование и хеширование: PasswordHasher<T> для безопасного хранения паролей
  • Refresh Tokens: Механизм обновления JWT токенов без повторного ввода учетных данных

Рекомендации по безопасности

  • Всегда используйте HTTPS для передачи учетных данных
  • Храните пароли только в хешированном виде (BCrypt, Argon2)
  • Реализуйте защиту от CSRF (антифоргерийные токены)
  • Ограничивайте количество попыток входа (защита от брутфорса)
  • Используйте принцип наименьших привилегий при назначении прав
  • Регулярно обновляйте секретные ключи и сертификаты
  • Внедряйте логирование событий безопасности

Для современных приложений рекомендуется использовать JWT с Refresh Tokens для API или Identity Framework для традиционных веб-приложений. В микросервисной архитектуре часто применяют OAuth 2.0 с централизованным сервером авторизации (Keycloak, IdentityServer).

Как добавить авторизацию в приложение? | PrepBro