Files
CleanArchitecture-template/MyNewProjectName.Infrastructure/Services/CurrentUserService.cs
2026-02-26 14:04:18 +07:00

70 lines
1.9 KiB
C#

using System.Security.Claims;
using Microsoft.AspNetCore.Http;
using MyNewProjectName.Application.Interfaces;
namespace MyNewProjectName.Infrastructure.Services;
/// <summary>
/// Implementation of ICurrentUserService
/// Automatically extracts user information from HttpContext using IHttpContextAccessor
/// This follows Clean Architecture principles - no dependency on concrete middleware
/// </summary>
public class CurrentUserService : ICurrentUserService
{
private readonly IHttpContextAccessor _httpContextAccessor;
public CurrentUserService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public string? UserId
{
get
{
var user = _httpContextAccessor.HttpContext?.User;
if (user?.Identity?.IsAuthenticated != true)
return null;
return user.FindFirstValue(ClaimTypes.NameIdentifier)
?? user.FindFirstValue("sub")
?? user.FindFirstValue("userId");
}
}
public string? UserName
{
get
{
var user = _httpContextAccessor.HttpContext?.User;
if (user?.Identity?.IsAuthenticated != true)
return null;
return user.FindFirstValue(ClaimTypes.Name)
?? user.FindFirstValue("name")
?? user.FindFirstValue("username");
}
}
public bool? IsAuthenticated
{
get
{
return _httpContextAccessor.HttpContext?.User?.Identity?.IsAuthenticated;
}
}
public string? Role
{
get
{
var user = _httpContextAccessor.HttpContext?.User;
if (user?.Identity?.IsAuthenticated != true)
return null;
return user.FindFirstValue(ClaimTypes.Role)
?? user.FindFirstValue("role");
}
}
}