Browse Source

Always change current tenant to host in IdentityLinkUserManager.

pull/7953/head
maliming 6 years ago
parent
commit
6df634bb28
  1. 94
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserLinkManager.cs

94
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.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -25,63 +24,66 @@ namespace Volo.Abp.Identity
public async Task<List<IdentityLinkUser>> GetListAsync(IdentityLinkUserInfo linkUserInfo, bool includeIndirect = false, CancellationToken cancellationToken = default) public async Task<List<IdentityLinkUser>> GetListAsync(IdentityLinkUserInfo linkUserInfo, bool includeIndirect = false, CancellationToken cancellationToken = default)
{ {
var users = await IdentityLinkUserRepository.GetListAsync(linkUserInfo, cancellationToken: cancellationToken); using (CurrentTenant.Change(null))
if (includeIndirect == false)
{ {
return users; var users = await IdentityLinkUserRepository.GetListAsync(linkUserInfo, cancellationToken: cancellationToken);
} if (includeIndirect == false)
{
return users;
}
var userInfos = new List<IdentityLinkUserInfo>() var userInfos = new List<IdentityLinkUserInfo>()
{ {
linkUserInfo linkUserInfo
}; };
var allUsers = new List<IdentityLinkUser>(); var allUsers = new List<IdentityLinkUser>();
allUsers.AddRange(users); allUsers.AddRange(users);
do do
{
var nextUsers = new List<IdentityLinkUserInfo>();
foreach (var user in users)
{ {
if (userInfos.Any(x => x.TenantId != user.SourceTenantId || x.UserId != user.SourceUserId)) var nextUsers = new List<IdentityLinkUserInfo>();
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<IdentityLinkUser>();
foreach (var next in nextUsers)
{ {
nextUsers.Add(new IdentityLinkUserInfo(user.TargetUserId, user.TargetTenantId)); users.AddRange(await IdentityLinkUserRepository.GetListAsync(next, userInfos, cancellationToken));
} }
}
users = new List<IdentityLinkUser>(); userInfos.AddRange(nextUsers);
foreach (var next in nextUsers) allUsers.AddRange(users);
{ } while (users.Any());
users.AddRange(await IdentityLinkUserRepository.GetListAsync(next, userInfos, cancellationToken));
}
userInfos.AddRange(nextUsers); return allUsers;
allUsers.AddRange(users); }
} while (users.Any());
return allUsers;
} }
public virtual async Task LinkAsync(IdentityLinkUserInfo sourceLinkUser, IdentityLinkUserInfo targetLinkUser, CancellationToken cancellationToken = default) 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)) if (await IsLinkedAsync(sourceLinkUser, targetLinkUser, cancellationToken: cancellationToken))
{ {
return; return;
} }
using (CurrentTenant.Change(null))
{
var userLink = new IdentityLinkUser( var userLink = new IdentityLinkUser(
GuidGenerator.Create(), GuidGenerator.Create(),
sourceLinkUser, sourceLinkUser,
@ -96,7 +98,7 @@ namespace Volo.Abp.Identity
{ {
if (includeIndirect) 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 || .Any(x => x.SourceTenantId == targetLinkUser.TenantId && x.SourceUserId == targetLinkUser.UserId ||
x.TargetTenantId == targetLinkUser.TenantId && x.TargetUserId == 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) public virtual async Task UnlinkAsync(IdentityLinkUserInfo sourceLinkUser, IdentityLinkUserInfo targetLinkUser, CancellationToken cancellationToken = default)
{ {
if (!await IsLinkedAsync(sourceLinkUser, targetLinkUser, cancellationToken: cancellationToken))
{
return;
}
using (CurrentTenant.Change(null)) using (CurrentTenant.Change(null))
{ {
if (!await IsLinkedAsync(sourceLinkUser, targetLinkUser, cancellationToken: cancellationToken))
{
return;
}
var linkedUser = await IdentityLinkUserRepository.FindAsync(sourceLinkUser, targetLinkUser, cancellationToken); var linkedUser = await IdentityLinkUserRepository.FindAsync(sourceLinkUser, targetLinkUser, cancellationToken);
if (linkedUser != null) if (linkedUser != null)
{ {

Loading…
Cancel
Save