ApiUser.cs 955 B

1234567891011121314151617181920212223242526272829303132
  1. using System.Security.Claims;
  2. namespace RunnersMeet.Server;
  3. public class ApiUser
  4. {
  5. private const string UnknownUserId = "<unknown>";
  6. private static readonly AsyncLocal<ApiUser> AsyncLocal = new AsyncLocal<ApiUser>();
  7. public static ApiUser Current =>
  8. AsyncLocal.Value ?? throw new InvalidOperationException("No user present in request context");
  9. public static void Create(ClaimsPrincipal principal)
  10. {
  11. if (AsyncLocal.Value != null)
  12. {
  13. throw new InvalidOperationException("User can only be set once per request");
  14. }
  15. AsyncLocal.Value = new ApiUser(principal);
  16. }
  17. public string UserId { get; }
  18. public IList<string> Claims { get; }
  19. public bool IsValidUser => UserId != UnknownUserId;
  20. private ApiUser(ClaimsPrincipal principal)
  21. {
  22. UserId = principal.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? UnknownUserId;
  23. Claims = principal.FindAll("permissions").Select(claim => claim.Value).ToList();
  24. }
  25. }