using System.Security.Claims; namespace WordVersioning.Api.Services; public interface ICurrentUser { /// userId จาก claim `sub` เท่านั้น (FR-8 — ห้ามรับจาก client) string UserId { get; } /// username จาก claim `preferred_username` (ถ้ามี) string? UserName { get; } } /// ดึง identity ของผู้เรียกจาก JWT claims — ใช้ตอนบันทึก CreatedByUserId / UpdatedByUserId public class CurrentUser(IHttpContextAccessor accessor) : ICurrentUser { private readonly ClaimsPrincipal _principal = accessor.HttpContext?.User ?? throw new InvalidOperationException("CurrentUser ต้องเรียกภายใน request ที่มี HttpContext"); public string UserId => _principal.FindFirst("sub")?.Value ?? throw new UnauthorizedAccessException("token ไม่มี claim 'sub'"); public string? UserName => _principal.FindFirst("preferred_username")?.Value; }