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

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

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

Начать курс

Авторизация и аутентификация в C# (.NET): от основ до промышленных решений

Безопасность веб-приложений — критически важный аспект разработки, и в экосистеме C# (.NET) для реализации аутентификации (проверки подлинности пользователя) и авторизации (проверки прав доступа) существует мощный стек инструментов. В этой статье мы разберём ключевые подходы: от встроенного ASP.NET Core Identity до гибких решений на базе JWT и OAuth 2.0.

1. ASP.NET Core Identity — встроенная система управления пользователями

ASP.NET Core Identity — это полноценный фреймворк для регистрации, входа, управления ролями и паролями. Он предоставляет готовые модели (User, Role), хранилище (по умолчанию Entity Framework + SQL Server) и middleware.

// Регистрация в Program.cs
builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

builder.Services.AddDefaultIdentity<IdentityUser>(options =>
{
    options.SignIn.RequireConfirmedAccount = true;
    options.Password.RequiredLength = 8;
})
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<AppDbContext>();

// Middleware
app.UseAuthentication();
app.UseAuthorization();

Пример контроллера с защитой:

[Authorize(Roles = "Admin")]
public class AdminController : Controller
{
    public IActionResult Index() => View();
}

// Получение текущего пользователя
var user = await _userManager.GetUserAsync(User);
var roles = await _userManager.GetRolesAsync(user);

2. JWT (JSON Web Token) — бесшовная аутентификация для API и SPA

JWT — это компактный URL-безопасный токен, который содержит claims (утверждения) о пользователе. Идеально подходит для REST API, мобильных приложений и Single Page Applications (React, Angular, Vue).

Установка пакета:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

Конфигурация в Program.cs:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidIssuer = "https://pythonlib.ru",
            ValidateAudience = true,
            ValidAudience = "https://api.pythonlib.ru",
            ValidateLifetime = true,
            IssuerSigningKey = new SymmetricSecurityKey(
                Encoding.UTF8.GetBytes("SuperSecretKey123!SuperSecretKey123!")),
            ClockSkew = TimeSpan.Zero
        };
    });

Генерация токена (например, в контроллере логина):

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, user.UserName),
    new Claim(ClaimTypes.Role, "User"),
    new Claim("custom_claim", "value")
};

var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SuperSecretKey123!"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

var token = new JwtSecurityToken(
    issuer: "https://pythonlib.ru",
    audience: "https://api.pythonlib.ru",
    claims: claims,
    expires: DateTime.Now.AddHours(2),
    signingCredentials: creds);

return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });

Защита эндпоинта:

[Authorize]
[HttpGet("profile")]
public IActionResult GetProfile()
{
    var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
    return Ok(new { Message = "Доступ разрешён", UserId = userId });
}

3. Cookie-аутентификация — классика для MVC-приложений

Для традиционных серверных приложений (Razor Pages, MVC) удобно использовать cookie-аутентификацию. Пользователь получает encrypted cookie, который автоматически отправляется с каждым запросом.

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.LoginPath = "/Account/Login";
        options.LogoutPath = "/Account/Logout";
        options.ExpireTimeSpan = TimeSpan.FromDays(7);
        options.SlidingExpiration = true;
    });

Вход пользователя:

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, "admin"),
    new Claim("FullName", "Администратор")
};

var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var principal = new ClaimsPrincipal(identity);

await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);

4. OAuth 2.0 и внешние провайдеры (Google, GitHub, VK)

.NET Core поддерживает аутентификацию через сторонние сервисы. Это упрощает UX — пользователи входят через свои аккаунты в соцсетях.

Пример для Google:

builder.Services                    

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