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

Что такое идентификация?

2.3 Middle🔥 211 комментариев
#ASP.NET и Web API#Аутентификация и безопасность

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

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

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

Идентификация в контексте C# Backend разработки

Идентификация — это процесс определения субъекта (пользователя, системы или процесса) в системе. Это первый шаг в процессе аутентификации и авторизации, отвечающий на вопрос: "Кто пытается получить доступ?"

В отличие от аутентификации (проверки подлинности, "Ты действительно тот, за кого себя выдаёшь?") и авторизации (проверки прав, "Что ты можешь делать?"), идентификация не проверяет доказательства — она лишь устанавливает идентификатор субъекта.

Основные механизмы идентификации в C# / ASP.NET Core

1. Идентификаторы пользователей

Идентификатор чаще всего представлен уникальным ключом:

// Пример использования идентификатора в модели пользователя
public class ApplicationUser
{
    public int Id { get; set; } // Уникальный числовой идентификатор
    public string UserName { get; set; } // Логин как идентификатор
    public string Email { get; set; } // Email как альтернативный идентификатор
    public Guid ExternalId { get; set; } // GUID для внешних систем
}

2. Идентификация через утверждения (Claims)

В современных системах на основе JWT (JSON Web Tokens) или Claims-based идентификации, субъект определяется набором утверждений:

// Пример утверждений в ASP.NET Core Identity
var claims = new List<Claim>
{
    new Claim(ClaimTypes.NameIdentifier, "user123"), // Основный идентификатор
    new Claim(ClaimTypes.Name, "John Doe"), // Отображаемое имя
    new Claim(ClaimTypes.Email, "john@example.com"), // Email как идентификатор
    new Claim("Department", "Engineering") // Пользовательское утверждение
};

// Создание идентификатора на основе утверждений
var identity = new ClaimsIdentity(claims, "CustomAuthentication");
var principal = new ClaimsPrincipal(identity);

3. Контекст идентификации в ASP.NET Core

ASP.NET Core предоставляет стандартные механизмы для работы с идентификацией:

// Получение идентификатора текущего пользователя в контроллере
public class UserController : ControllerBase
{
    public IActionResult GetCurrentUserId()
    {
        // Основные методы для получения идентификатора
        var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
        var userName = User.Identity.Name;
        
        // Проверка, что идентификация выполнена
        if (User.Identity?.IsAuthenticated == false)
            return Unauthorized();
        
        return Ok($"Идентификатор пользователя: {userId}");
    }
}

Практические реализации идентификации

Идентификация по JWT токену

// Пример middleware для идентификации по JWT в ASP.NET Core
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            // Параметры, определяющие как извлекать идентификатор из токена
            ValidIssuer = issuer,
            ValidAudience = audience,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret))
        };
    });

// В JWT токене идентификатор хранится в стандартном поле 'sub'
{
  "sub": "user123456", // Subject - идентификатор субъекта
  "name": "Иван Петров",
  "exp": 1678901234
}

Идентификация в микросервисной архитектуре

В распределенных системах идентификация часто передается через заголовки:

// Передача идентификатора между микросервисами
public async Task CallExternalService(string userId)
{
    using var client = new HttpClient();
    client.DefaultRequestHeaders.Add("X-User-Id", userId); // Идентификатор в заголовке
    client.DefaultRequestHeaders.Add("X-Request-Id", Guid.NewGuid().ToString());
    
    var response = await client.GetAsync("https://api.service.com/data");
}

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

  • Уникальность: Идентификатор должен быть уникальным в пределах системы
  • Перманентность: Идентификатор не должен изменяться в течение жизни субъекта
  • Непрозрачность: В публичных API рекомендуется использовать неинформативные идентификаторы (GUID вместо email)
  • Контекстуальность: Идентификатор может быть разным в разных контекстах (пользователь, устройство, сессия)
  • Безопасность: Идентификаторы не должны быть предсказуемыми или раскрывать внутреннюю структуру системы

Пример сложной идентификации в enterprise-системах

// Комплексная модель идентификации для корпоративного приложения
public class CompositeIdentity
{
    public string UserId { get; set; } // Идентификатор пользователя
    public string TenantId { get; set; } // Идентификатор организации (тенанта)
    public string SessionId { get; set; } // Идентификатор сессии
    public string DeviceId { get; set; } // Идентификатор устройства
    
    // Метод создания уникального ключа для распределенных систем
    public string GetGlobalIdentityKey()
    {
        return $"{TenantId}:{UserId}:{SessionId}:{DeviceId}";
    }
}

// Использование в фильтрах ASP.NET Core
public class IdentityMiddleware : IMiddleware
{
    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
        // Извлечение идентификаторов из различных источников
        var userId = context.Request.Headers["X-User-Id"];
        var tenantId = context.Request.Headers["X-Tenant-Id"];
        
        // Создание контекста идентификации
        var identity = new CompositeIdentity 
        { 
            UserId = userId, 
            TenantId = tenantId 
        };
        
        context.Items["CurrentIdentity"] = identity;
        await next(context);
    }
}

Заключение

Идентификация является фундаментальным процессом в безопасности приложений. В C# Backend разработке она реализуется через:

  • Уникальные ключи в моделях данных
  • Claims-based подход в ASP.NET Core Identity
  • JWT токены в современных API
  • Заголовки HTTP в микросервисных архитектурах

Правильная реализация идентификации позволяет создать надежную основу для последующих процессов аутентификации и авторизации, обеспечивая безопасность и корректную работу распределенных систем.

Что такое идентификация? | PrepBro