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