26 lines
1.1 KiB
C#
26 lines
1.1 KiB
C#
|
|
using System.Security.Claims;
|
||
|
|
|
||
|
|
namespace WordVersioning.Api.Services;
|
||
|
|
|
||
|
|
public interface ICurrentUser
|
||
|
|
{
|
||
|
|
/// <summary>userId จาก claim `sub` เท่านั้น (FR-8 — ห้ามรับจาก client)</summary>
|
||
|
|
string UserId { get; }
|
||
|
|
|
||
|
|
/// <summary>username จาก claim `preferred_username` (ถ้ามี)</summary>
|
||
|
|
string? UserName { get; }
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>ดึง identity ของผู้เรียกจาก JWT claims — ใช้ตอนบันทึก CreatedByUserId / UpdatedByUserId</summary>
|
||
|
|
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;
|
||
|
|
}
|