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