|  |  |  | @ -16,6 +16,8 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider | 
			
		
	
		
			
				
					|  |  |  |  |     protected IdentityUserManager UserManager { get; } | 
			
		
	
		
			
				
					|  |  |  |  |     protected IIdentityUserRepository IdentityUserRepository { get; } | 
			
		
	
		
			
				
					|  |  |  |  |     protected IOptions<IdentityOptions> IdentityOptions { get; } | 
			
		
	
		
			
				
					|  |  |  |  |      | 
			
		
	
		
			
				
					|  |  |  |  |     public bool CanObtainUserInfoWithoutPassword { get; set; } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     protected ExternalLoginProviderBase( | 
			
		
	
		
			
				
					|  |  |  |  |         IGuidGenerator guidGenerator, | 
			
		
	
	
		
			
				
					|  |  |  | @ -29,19 +31,21 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider | 
			
		
	
		
			
				
					|  |  |  |  |         UserManager = userManager; | 
			
		
	
		
			
				
					|  |  |  |  |         IdentityUserRepository = identityUserRepository; | 
			
		
	
		
			
				
					|  |  |  |  |         IdentityOptions = identityOptions; | 
			
		
	
		
			
				
					|  |  |  |  |         CanObtainUserInfoWithoutPassword = true; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public abstract Task<bool> TryAuthenticateAsync(string userName, string plainPassword); | 
			
		
	
		
			
				
					|  |  |  |  |      | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public abstract Task<bool> IsEnabledAsync(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public virtual async Task<IdentityUser> CreateUserAsync(string userName, string providerName) | 
			
		
	
		
			
				
					|  |  |  |  |     public virtual async Task<IdentityUser> CreateUserAsync(string userName, string providerName, string plainPassword = null) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         await IdentityOptions.SetAsync(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         var externalUser = await GetUserInfoAsync(userName); | 
			
		
	
		
			
				
					|  |  |  |  |         NormalizeExternalLoginUserInfo(externalUser, userName); | 
			
		
	
		
			
				
					|  |  |  |  |         var externalUser = CanObtainUserInfoWithoutPassword ? await GetUserInfoAsync(userName) : await GetUserInfoAsync(userName, plainPassword); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         NormalizeExternalLoginUserInfo(externalUser, userName); | 
			
		
	
		
			
				
					|  |  |  |  |          | 
			
		
	
		
			
				
					|  |  |  |  |         var user = new IdentityUser( | 
			
		
	
		
			
				
					|  |  |  |  |             GuidGenerator.Create(), | 
			
		
	
		
			
				
					|  |  |  |  |             userName, | 
			
		
	
	
		
			
				
					|  |  |  | @ -78,11 +82,17 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider | 
			
		
	
		
			
				
					|  |  |  |  |         return user; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public virtual async Task UpdateUserAsync(IdentityUser user, string providerName) | 
			
		
	
		
			
				
					|  |  |  |  |     public virtual async Task UpdateUserAsync(IdentityUser user, string providerName, string plainPassword = null) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         await IdentityOptions.SetAsync(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         var externalUser = await GetUserInfoAsync(user); | 
			
		
	
		
			
				
					|  |  |  |  |         if (!CanObtainUserInfoWithoutPassword) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             Check.NotNullOrWhiteSpace(plainPassword, nameof(plainPassword)); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |          | 
			
		
	
		
			
				
					|  |  |  |  |         var externalUser = CanObtainUserInfoWithoutPassword ? await GetUserInfoAsync(user) : await GetUserInfoAsync(user, plainPassword); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         NormalizeExternalLoginUserInfo(externalUser, user.UserName); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (!externalUser.Name.IsNullOrWhiteSpace()) | 
			
		
	
	
		
			
				
					|  |  |  | @ -147,10 +157,17 @@ public abstract class ExternalLoginProviderBase : IExternalLoginProvider | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     protected abstract Task<ExternalLoginUserInfo> GetUserInfoAsync(string userName); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     protected abstract Task<ExternalLoginUserInfo> GetUserInfoAsync(string userName, string plainPassword); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     protected virtual Task<ExternalLoginUserInfo> GetUserInfoAsync(IdentityUser user) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         return GetUserInfoAsync(user.UserName); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |      | 
			
		
	
		
			
				
					|  |  |  |  |     protected virtual Task<ExternalLoginUserInfo> GetUserInfoAsync(IdentityUser user, string plainPassword) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         return GetUserInfoAsync(user.UserName, plainPassword); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     private static void NormalizeExternalLoginUserInfo( | 
			
		
	
		
			
				
					|  |  |  |  |         ExternalLoginUserInfo externalUser, | 
			
		
	
	
		
			
				
					|  |  |  | 
 |