Add CanObtainUserInfoWithoutPassword to IExternalLoginProvider

pull/12712/head
liangshiwei 3 years ago
parent fd5cfa4c73
commit 0ae62dcfe9

@ -49,11 +49,21 @@ public class AbpSignInManager : SignInManager<IdentityUser>
var user = await UserManager.FindByNameAsync(userName);
if (user == null)
{
user = await externalLoginProvider.CreateUserAsync(userName, externalLoginProviderInfo.Name);
user = externalLoginProvider.CanObtainUserInfoWithoutPassword
? await externalLoginProvider.CreateUserAsync(userName, externalLoginProviderInfo.Name)
: await externalLoginProvider.CreateUserAsync(userName, externalLoginProviderInfo.Name, password);
}
else
{
await externalLoginProvider.UpdateUserAsync(user, externalLoginProviderInfo.Name);
if (externalLoginProvider.CanObtainUserInfoWithoutPassword)
{
await externalLoginProvider.UpdateUserAsync(user, externalLoginProviderInfo.Name);
}
else
{
await externalLoginProvider.UpdateUserAsync(user, externalLoginProviderInfo.Name, password);
}
}
return await SignInOrTwoFactorAsync(user, isPersistent);

@ -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,

@ -4,6 +4,8 @@ namespace Volo.Abp.Identity;
public interface IExternalLoginProvider
{
bool CanObtainUserInfoWithoutPassword { get; set; }
/// <summary>
/// Used to try authenticate a user by this source.
/// </summary>
@ -18,8 +20,9 @@ public interface IExternalLoginProvider
/// </summary>
/// <param name="userName">User name</param>
/// <param name="providerName">The name of this provider</param>
/// <param name="plainPassword">Optional, plain password of the user</param>
/// <returns>Newly created user</returns>
Task<IdentityUser> CreateUserAsync(string userName, string providerName);
Task<IdentityUser> CreateUserAsync(string userName, string providerName, string plainPassword = null);
/// <summary>
/// This method is called after an existing user is authenticated by this source.
@ -27,7 +30,8 @@ public interface IExternalLoginProvider
/// </summary>
/// <param name="providerName">The name of this provider</param>
/// <param name="user">The user that can be updated</param>
Task UpdateUserAsync(IdentityUser user, string providerName);
/// <param name="plainPassword">Optional, plain password of the user</param>
Task UpdateUserAsync(IdentityUser user, string providerName, string plainPassword = null);
/// <summary>
/// Return a value indicating whether this source is enabled.

@ -60,4 +60,9 @@ public class FakeExternalLoginProvider : ExternalLoginProviderBase, ITransientDe
}
);
}
protected override Task<ExternalLoginUserInfo> GetUserInfoAsync(string userName, string plainPassword)
{
return GetUserInfoAsync(userName);
}
}

Loading…
Cancel
Save