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

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

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

Начать курс

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

В современной веб-разработке на платформе .NET темы аутентификации (проверки подлинности пользователя) и авторизации (проверки прав доступа) являются фундаментальными. Библиотеки и встроенные механизмы ASP.NET Core предоставляют мощный и гибкий инструментарий для реализации этих задач. В этой статье мы подробно разберем основные подходы, включая использование JWT (JSON Web Tokens), ASP.NET Core Identity и встроенных middleware-компонентов.

Основные концепции

  • Аутентификация (Authentication) — процесс проверки, кем является пользователь (например, логин + пароль).
  • Авторизация (Authorization) — процесс определения, что пользователь может делать (роли, политики, claims).
  • Claims-based identity — подход, при котором информация о пользователе хранится в виде набора утверждений (claims).

ASP.NET Core Identity

ASP.NET Core Identity — это полноценная система управления пользователями, которая включает регистрацию, вход, сброс пароля, двухфакторную аутентификацию и управление ролями. Она использует Entity Framework Core для хранения данных в базе.

Для подключения Identity в проекте достаточно добавить вызов AddDefaultIdentity и настроить строку подключения. Пример базовой настройки в Program.cs:

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using YourApp.Data;

var builder = WebApplication.CreateBuilder(args);

// Добавляем контекст БД
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

// Добавляем Identity
builder.Services.AddDefaultIdentity<IdentityUser>(options => 
{
    options.SignIn.RequireConfirmedAccount = false;
    options.Password.RequireDigit = true;
    options.Password.RequiredLength = 6;
})
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();

builder.Services.AddControllersWithViews();

var app = builder.Build();

app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();
app.Run();

После этого вам станут доступны стандартные страницы регистрации и входа, а также методы для проверки ролей:

[Authorize(Roles = "Admin")]
public IActionResult AdminPanel()
{
    return View();
}

JWT-аутентификация (JSON Web Tokens)

JWT — это компактный и самодостаточный способ передачи информации между сторонами в виде JSON-объекта. В .NET JWT часто используется для создания REST API и SPA-приложений. Основная библиотека — Microsoft.AspNetCore.Authentication.JwtBearer.

Настройка JWT в Program.cs:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;

var builder = WebApplication.CreateBuilder(args);

var key = Encoding.ASCII.GetBytes("YourSuperSecretKeyThatIsAtLeast32CharactersLong!");

builder.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 = "yourdomain.com",
        ValidAudience = "yourdomain.com",
        IssuerSigningKey = new SymmetricSecurityKey(key)
    };
});

builder.Services.AddAuthorization();
builder.Services.AddControllers();

var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();

Пример генерации токена в контроллере:

[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel model)
{
    // Проверка пользователя (например, из БД)
    if (model.Username == "admin" && model.Password == "password")
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes("YourSuperSecretKeyThatIsAtLeast32CharactersLong!");
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new Claim[]
            {
                new Claim(ClaimTypes.Name, model.Username),
                new Claim(ClaimTypes.Role, "Admin")
            }),
            Expires = DateTime.UtcNow.AddHours(1),
            Issuer = "yourdomain.com",
            Audience = "yourdomain.com",
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        };
        var token = tokenHandler.CreateToken(tokenDescriptor);
        return Ok(new { Token = tokenHandler.WriteToken(token) });
    }
    return Unauthorized();
}

Клиент отправляет токен в заголовке Authorization: Bearer {token}. Middleware автоматически проверяет токен и заполняет HttpContext.User.

OAuth 2.0 и внешние провайдеры

ASP.NET Core поддерживает аутентификацию через Google, Facebook, Microsoft, GitHub и другие OAuth 2.0 провайдеры. Для этого используются пакеты вида Microsoft.AspNetCore.Aut

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