Browse Source

Add CanObtainUserInfoWithoutPassword to IExternalLoginProvider

pull/12712/head
liangshiwei 4 years ago
parent
commit
0ae62dcfe9
  1. 14
      modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs
  2. 29
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs
  3. 8
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs
  4. 5
      modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs

14
modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/AbpSignInManager.cs

@ -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);

29
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/ExternalLoginProviderBase.cs

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

8
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IExternalLoginProvider.cs

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

5
modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs

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

Loading…
Cancel
Save