From 6df634bb28e976a6c6e390bbc9c7b76fab02dd46 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 5 Mar 2021 13:04:47 +0800 Subject: [PATCH] Always change current tenant to host in IdentityLinkUserManager. --- .../Abp/Identity/IdentityUserLinkManager.cs | 94 ++++++++++--------- 1 file changed, 48 insertions(+), 46 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserLinkManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserLinkManager.cs index 3e979b6420..d4c89a6ad5 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserLinkManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserLinkManager.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -25,63 +24,66 @@ namespace Volo.Abp.Identity public async Task> GetListAsync(IdentityLinkUserInfo linkUserInfo, bool includeIndirect = false, CancellationToken cancellationToken = default) { - var users = await IdentityLinkUserRepository.GetListAsync(linkUserInfo, cancellationToken: cancellationToken); - if (includeIndirect == false) + using (CurrentTenant.Change(null)) { - return users; - } + var users = await IdentityLinkUserRepository.GetListAsync(linkUserInfo, cancellationToken: cancellationToken); + if (includeIndirect == false) + { + return users; + } - var userInfos = new List() - { - linkUserInfo - }; + var userInfos = new List() + { + linkUserInfo + }; - var allUsers = new List(); - allUsers.AddRange(users); + var allUsers = new List(); + allUsers.AddRange(users); - do - { - var nextUsers = new List(); - foreach (var user in users) + do { - if (userInfos.Any(x => x.TenantId != user.SourceTenantId || x.UserId != user.SourceUserId)) + var nextUsers = new List(); + foreach (var user in users) { - nextUsers.Add(new IdentityLinkUserInfo(user.SourceUserId, user.SourceTenantId)); + if (userInfos.Any(x => x.TenantId != user.SourceTenantId || x.UserId != user.SourceUserId)) + { + nextUsers.Add(new IdentityLinkUserInfo(user.SourceUserId, user.SourceTenantId)); + } + + if (userInfos.Any(x => x.TenantId != user.TargetTenantId || x.UserId != user.TargetUserId)) + { + nextUsers.Add(new IdentityLinkUserInfo(user.TargetUserId, user.TargetTenantId)); + } } - if (userInfos.Any(x => x.TenantId != user.TargetTenantId || x.UserId != user.TargetUserId)) + users = new List(); + foreach (var next in nextUsers) { - nextUsers.Add(new IdentityLinkUserInfo(user.TargetUserId, user.TargetTenantId)); + users.AddRange(await IdentityLinkUserRepository.GetListAsync(next, userInfos, cancellationToken)); } - } - users = new List(); - foreach (var next in nextUsers) - { - users.AddRange(await IdentityLinkUserRepository.GetListAsync(next, userInfos, cancellationToken)); - } + userInfos.AddRange(nextUsers); + allUsers.AddRange(users); + } while (users.Any()); - userInfos.AddRange(nextUsers); - allUsers.AddRange(users); - } while (users.Any()); - - return allUsers; + return allUsers; + } } public virtual async Task LinkAsync(IdentityLinkUserInfo sourceLinkUser, IdentityLinkUserInfo targetLinkUser, CancellationToken cancellationToken = default) { - if (sourceLinkUser.UserId == targetLinkUser.UserId && sourceLinkUser.TenantId == targetLinkUser.TenantId) + using (CurrentTenant.Change(null)) { - return; - } + if (sourceLinkUser.UserId == targetLinkUser.UserId && sourceLinkUser.TenantId == targetLinkUser.TenantId) + { + return; + } - if (await IsLinkedAsync(sourceLinkUser, targetLinkUser, cancellationToken: cancellationToken)) - { - return; - } + if (await IsLinkedAsync(sourceLinkUser, targetLinkUser, cancellationToken: cancellationToken)) + { + return; + } - using (CurrentTenant.Change(null)) - { var userLink = new IdentityLinkUser( GuidGenerator.Create(), sourceLinkUser, @@ -96,7 +98,7 @@ namespace Volo.Abp.Identity { if (includeIndirect) { - return (await IdentityLinkUserRepository.GetListAsync(sourceLinkUser, cancellationToken: cancellationToken)) + return (await GetListAsync(sourceLinkUser, true, cancellationToken: cancellationToken)) .Any(x => x.SourceTenantId == targetLinkUser.TenantId && x.SourceUserId == targetLinkUser.UserId || x.TargetTenantId == targetLinkUser.TenantId && x.TargetUserId == targetLinkUser.UserId); } @@ -106,13 +108,13 @@ namespace Volo.Abp.Identity public virtual async Task UnlinkAsync(IdentityLinkUserInfo sourceLinkUser, IdentityLinkUserInfo targetLinkUser, CancellationToken cancellationToken = default) { - if (!await IsLinkedAsync(sourceLinkUser, targetLinkUser, cancellationToken: cancellationToken)) - { - return; - } - using (CurrentTenant.Change(null)) { + if (!await IsLinkedAsync(sourceLinkUser, targetLinkUser, cancellationToken: cancellationToken)) + { + return; + } + var linkedUser = await IdentityLinkUserRepository.FindAsync(sourceLinkUser, targetLinkUser, cancellationToken); if (linkedUser != null) {