JwtClaimTenantResolveContributor.cs 1.15 KB
using Microsoft.AspNetCore.Http;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Security.Claims;
using Yi.Framework.Rbac.Domain.Shared.Consts;

namespace FoodLabeling.Application.MultiTenancy;

/// <summary>
/// 从 JWT Claim <see cref="TokenTypeConst.TenantId"/> 解析当前租户(泰额版登录写入)
/// </summary>
public class JwtClaimTenantResolveContributor : TenantResolveContributorBase
{
    public const string ContributorName = "JwtClaim";

    public override string Name => ContributorName;

    public override Task ResolveAsync(ITenantResolveContext context)
    {
        var httpContext = context.ServiceProvider.GetService(typeof(IHttpContextAccessor)) as IHttpContextAccessor;
        var user = httpContext?.HttpContext?.User;
        if (user?.Identity?.IsAuthenticated != true)
        {
            return Task.CompletedTask;
        }

        var tenantClaim = user.FindFirst(TokenTypeConst.TenantId)?.Value
                          ?? user.FindFirst(AbpClaimTypes.TenantId)?.Value;
        if (!string.IsNullOrWhiteSpace(tenantClaim))
        {
            context.TenantIdOrName = tenantClaim;
        }

        return Task.CompletedTask;
    }
}