diff --git a/modules/users/src/Volo.Abp.Users.Domain/Volo/Abp/Users/UserLookupService.cs b/modules/users/src/Volo.Abp.Users.Domain/Volo/Abp/Users/UserLookupService.cs index 7333434fc1..09979f00e1 100644 --- a/modules/users/src/Volo.Abp.Users.Domain/Volo/Abp/Users/UserLookupService.cs +++ b/modules/users/src/Volo.Abp.Users.Domain/Volo/Abp/Users/UserLookupService.cs @@ -12,6 +12,8 @@ namespace Volo.Abp.Users where TUser : class, IUser where TUserRepository : IUserRepository { + protected bool SkipExternalLookupIfLocalUserExists { get; set; } = true; + public IExternalUserLookupServiceProvider ExternalUserLookupServiceProvider { get; set; } public ILogger> Logger { get; set; } @@ -30,9 +32,16 @@ namespace Volo.Abp.Users public async Task FindByIdAsync(Guid id, CancellationToken cancellationToken = default) { + var localUser = await _userRepository.FindAsync(id, cancellationToken: cancellationToken); + if (ExternalUserLookupServiceProvider == null) { - return await _userRepository.FindAsync(id, cancellationToken: cancellationToken); + return localUser; + } + + if (SkipExternalLookupIfLocalUserExists && localUser != null) + { + return localUser; } IUserData externalUser; @@ -42,8 +51,11 @@ namespace Volo.Abp.Users externalUser = await ExternalUserLookupServiceProvider.FindByIdAsync(id, cancellationToken); if (externalUser == null) { - //TODO: Instead of deleting, should be make it inactive or something like that? - await WithNewUowAsync(() => _userRepository.DeleteAsync(id, cancellationToken: cancellationToken)); + if (localUser != null) + { + //TODO: Instead of deleting, should be make it inactive or something like that? + await WithNewUowAsync(() => _userRepository.DeleteAsync(localUser, cancellationToken: cancellationToken)); + } return null; } @@ -51,14 +63,12 @@ namespace Volo.Abp.Users catch (Exception ex) { Logger.LogException(ex); - return await _userRepository.FindAsync(id, cancellationToken: cancellationToken); + return localUser; } - var localUser = await _userRepository.FindAsync(id, cancellationToken: cancellationToken); if (localUser == null) { await WithNewUowAsync(() => _userRepository.InsertAsync(CreateUser(externalUser), cancellationToken: cancellationToken)); - return await _userRepository.FindAsync(id, cancellationToken: cancellationToken); } @@ -76,9 +86,16 @@ namespace Volo.Abp.Users public async Task FindByUserNameAsync(string userName, CancellationToken cancellationToken = default) { + var localUser = await _userRepository.FindByUserNameAsync(userName, cancellationToken); + if (ExternalUserLookupServiceProvider == null) { - return await _userRepository.FindByUserNameAsync(userName, cancellationToken); + return localUser; + } + + if (SkipExternalLookupIfLocalUserExists && localUser != null) + { + return localUser; } IUserData externalUser; @@ -88,11 +105,10 @@ namespace Volo.Abp.Users externalUser = await ExternalUserLookupServiceProvider.FindByUserNameAsync(userName, cancellationToken); if (externalUser == null) { - var localExistingUser = await _userRepository.FindByUserNameAsync(userName, cancellationToken); - if (localExistingUser != null) + if (localUser != null) { //TODO: Instead of deleting, should be make it passive or something like that? - await WithNewUowAsync(() => _userRepository.DeleteAsync(localExistingUser.Id, cancellationToken: cancellationToken)); + await WithNewUowAsync(() => _userRepository.DeleteAsync(localUser, cancellationToken: cancellationToken)); } return null; @@ -101,10 +117,9 @@ namespace Volo.Abp.Users catch (Exception ex) { Logger.LogException(ex); - return await _userRepository.FindByUserNameAsync(userName, cancellationToken); + return localUser; } - var localUser = await _userRepository.FindByUserNameAsync(userName, cancellationToken); if (localUser == null) { await WithNewUowAsync(() => _userRepository.InsertAsync(CreateUser(externalUser), cancellationToken: cancellationToken));