AidopTenantHelper.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. using Admin.NET.Core;
  2. using Microsoft.AspNetCore.Http;
  3. namespace Admin.NET.Plugin.AiDOP.Infrastructure;
  4. /// <summary>
  5. /// 从 HTTP 请求(显式参数 / JWT / query tenantId)解析 TenantId;均无有效值时回退框架默认租户。
  6. /// <para>
  7. /// 警告:本方法允许前端指定租户且有默认回退,<b>不得用于业务数据的查询与写入</b>;
  8. /// 业务场景请用 <see cref="AidopTenantScope.ResolveOrThrow"/>。
  9. /// </para>
  10. /// </summary>
  11. public static class AidopTenantHelper
  12. {
  13. public static long GetTenantId(HttpContext? ctx) => Resolve(ctx);
  14. /// <summary>
  15. /// 解析租户:requestTenantId &gt; JWT Claim &gt; query tenantId &gt; DefaultTenantId。
  16. /// 不得用于业务数据的查询与写入(见类注释)。
  17. /// </summary>
  18. public static long Resolve(HttpContext? ctx, long? requestTenantId = null)
  19. {
  20. if (requestTenantId is > 0)
  21. return requestTenantId.Value;
  22. var claim = ctx?.User?.FindFirst(ClaimConst.TenantId)?.Value;
  23. if (!string.IsNullOrWhiteSpace(claim) && long.TryParse(claim, out var tid) && tid > 0)
  24. return tid;
  25. if (TryParseTenantId(ctx?.Request.Query["tenantId"].ToString(), out var queryTid))
  26. return queryTid;
  27. return SqlSugarConst.DefaultTenantId;
  28. }
  29. private static bool TryParseTenantId(string? raw, out long tenantId)
  30. {
  31. tenantId = 0;
  32. return !string.IsNullOrWhiteSpace(raw) && long.TryParse(raw.Trim(), out tenantId) && tenantId > 0;
  33. }
  34. }