ClaimsAbpSession.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System;
  2. using System.Linq;
  3. using System.Security.Claims;
  4. using System.Threading;
  5. using Abp.Configuration.Startup;
  6. using Abp.Dependency;
  7. using Abp.MultiTenancy;
  8. using Abp.Runtime.Security;
  9. namespace Abp.Runtime.Session
  10. {
  11. /// <summary>
  12. /// Implements <see cref="IAbpSession"/> to get session properties from current claims.
  13. /// </summary>
  14. public class ClaimsAbpSession : AbpSessionBase, ISingletonDependency
  15. {
  16. public override long? UserId
  17. {
  18. get
  19. {
  20. if (OverridedValue != null)
  21. {
  22. return OverridedValue.UserId;
  23. }
  24. var userIdClaim = PrincipalAccessor.Principal?.Claims.FirstOrDefault(c => c.Type == AbpClaimTypes.UserId);
  25. if (string.IsNullOrEmpty(userIdClaim?.Value))
  26. {
  27. return null;
  28. }
  29. long userId;
  30. if (!long.TryParse(userIdClaim.Value, out userId))
  31. {
  32. return null;
  33. }
  34. return userId;
  35. }
  36. }
  37. public override int? TenantId
  38. {
  39. get
  40. {
  41. if (!MultiTenancy.IsEnabled)
  42. {
  43. return MultiTenancyConsts.DefaultTenantId;
  44. }
  45. if (OverridedValue != null)
  46. {
  47. return OverridedValue.TenantId;
  48. }
  49. var tenantIdClaim = PrincipalAccessor.Principal?.Claims.FirstOrDefault(c => c.Type == AbpClaimTypes.TenantId);
  50. if (!string.IsNullOrEmpty(tenantIdClaim?.Value))
  51. {
  52. return Convert.ToInt32(tenantIdClaim.Value);
  53. }
  54. if (UserId == null)
  55. {
  56. //Resolve tenant id from request only if user has not logged in!
  57. return TenantResolver.ResolveTenantId();
  58. }
  59. return null;
  60. }
  61. }
  62. public override long? ImpersonatorUserId
  63. {
  64. get
  65. {
  66. var impersonatorUserIdClaim = PrincipalAccessor.Principal?.Claims.FirstOrDefault(c => c.Type == AbpClaimTypes.ImpersonatorUserId);
  67. if (string.IsNullOrEmpty(impersonatorUserIdClaim?.Value))
  68. {
  69. return null;
  70. }
  71. return Convert.ToInt64(impersonatorUserIdClaim.Value);
  72. }
  73. }
  74. public override int? ImpersonatorTenantId
  75. {
  76. get
  77. {
  78. if (!MultiTenancy.IsEnabled)
  79. {
  80. return MultiTenancyConsts.DefaultTenantId;
  81. }
  82. var impersonatorTenantIdClaim = PrincipalAccessor.Principal?.Claims.FirstOrDefault(c => c.Type == AbpClaimTypes.ImpersonatorTenantId);
  83. if (string.IsNullOrEmpty(impersonatorTenantIdClaim?.Value))
  84. {
  85. return null;
  86. }
  87. return Convert.ToInt32(impersonatorTenantIdClaim.Value);
  88. }
  89. }
  90. protected IPrincipalAccessor PrincipalAccessor { get; }
  91. protected ITenantResolver TenantResolver { get; }
  92. public ClaimsAbpSession(
  93. IPrincipalAccessor principalAccessor,
  94. IMultiTenancyConfig multiTenancy,
  95. ITenantResolver tenantResolver,
  96. IAmbientScopeProvider<SessionOverride> sessionOverrideScopeProvider)
  97. : base(
  98. multiTenancy,
  99. sessionOverrideScopeProvider)
  100. {
  101. TenantResolver = tenantResolver;
  102. PrincipalAccessor = principalAccessor;
  103. }
  104. }
  105. }