ClaimsPrincipalExtensions.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System;
  2. using System.Linq;
  3. using System.Security.Claims;
  4. using Jellyfin.Api.Constants;
  5. namespace Jellyfin.Api.Extensions;
  6. /// <summary>
  7. /// Extensions for <see cref="ClaimsPrincipal"/>.
  8. /// </summary>
  9. public static class ClaimsPrincipalExtensions
  10. {
  11. /// <summary>
  12. /// Get user id from claims.
  13. /// </summary>
  14. /// <param name="user">Current claims principal.</param>
  15. /// <returns>User id.</returns>
  16. public static Guid GetUserId(this ClaimsPrincipal user)
  17. {
  18. var value = GetClaimValue(user, InternalClaimTypes.UserId);
  19. return string.IsNullOrEmpty(value)
  20. ? default
  21. : Guid.Parse(value);
  22. }
  23. /// <summary>
  24. /// Get device id from claims.
  25. /// </summary>
  26. /// <param name="user">Current claims principal.</param>
  27. /// <returns>Device id.</returns>
  28. public static string? GetDeviceId(this ClaimsPrincipal user)
  29. => GetClaimValue(user, InternalClaimTypes.DeviceId);
  30. /// <summary>
  31. /// Get device from claims.
  32. /// </summary>
  33. /// <param name="user">Current claims principal.</param>
  34. /// <returns>Device.</returns>
  35. public static string? GetDevice(this ClaimsPrincipal user)
  36. => GetClaimValue(user, InternalClaimTypes.Device);
  37. /// <summary>
  38. /// Get client from claims.
  39. /// </summary>
  40. /// <param name="user">Current claims principal.</param>
  41. /// <returns>Client.</returns>
  42. public static string? GetClient(this ClaimsPrincipal user)
  43. => GetClaimValue(user, InternalClaimTypes.Client);
  44. /// <summary>
  45. /// Get version from claims.
  46. /// </summary>
  47. /// <param name="user">Current claims principal.</param>
  48. /// <returns>Version.</returns>
  49. public static string? GetVersion(this ClaimsPrincipal user)
  50. => GetClaimValue(user, InternalClaimTypes.Version);
  51. /// <summary>
  52. /// Get token from claims.
  53. /// </summary>
  54. /// <param name="user">Current claims principal.</param>
  55. /// <returns>Token.</returns>
  56. public static string? GetToken(this ClaimsPrincipal user)
  57. => GetClaimValue(user, InternalClaimTypes.Token);
  58. /// <summary>
  59. /// Gets a flag specifying whether the request is using an api key.
  60. /// </summary>
  61. /// <param name="user">Current claims principal.</param>
  62. /// <returns>The flag specifying whether the request is using an api key.</returns>
  63. public static bool GetIsApiKey(this ClaimsPrincipal user)
  64. {
  65. var claimValue = GetClaimValue(user, InternalClaimTypes.IsApiKey);
  66. return bool.TryParse(claimValue, out var parsedClaimValue)
  67. && parsedClaimValue;
  68. }
  69. private static string? GetClaimValue(in ClaimsPrincipal user, string name)
  70. => user.Claims.FirstOrDefault(claim => claim.Type.Equals(name, StringComparison.OrdinalIgnoreCase))?.Value;
  71. }