using Microsoft.AspNetCore.Http;
using System.Globalization;
using System.Security.Claims;
namespace StoreHub.Framework.Security;
///
/// 从 读取当前请求认证票据的默认实现。
///
public class CurrentUser : ICurrentUser
{
private readonly IHttpContextAccessor _httpContextAccessor;
public CurrentUser(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
///
/// 当前请求的
///
private ClaimsPrincipal? Principal => _httpContextAccessor.HttpContext?.User;
///
public bool IsAuthenticated => Principal?.Identity?.IsAuthenticated == true;
///
public int? Id
{
get
{
string? value = GetClaimValue(JwtClaimTypes.UserId);
return int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out int id) ? id : null;
}
}
///
public string? UserName => GetClaimValue(JwtClaimTypes.UserName);
///
public string? NickName => GetClaimValue(JwtClaimTypes.NickName);
///
public IEnumerable Claims => Principal?.Claims ?? [];
///
public string? GetClaimValue(string claimType)
{
if (string.IsNullOrWhiteSpace(claimType))
{
return null;
}
return Principal?.FindFirst(claimType)?.Value;
}
///
public T? GetClaimValue(string claimType)
{
string? value = GetClaimValue(claimType);
if (value is null)
{
return default;
}
try
{
return (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture);
}
catch
{
return default;
}
}
}