ClaimHelpers.cs 3.2 KB

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