From d12ef80a9d431e2968fd96b6466fe19962c52561 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 6 Aug 2020 18:56:33 +0300 Subject: [PATCH] Fix ExternalLoginProviderBase --- .../AspNetCore/ExternalLoginProviderBase.cs | 9 ++++- .../AspNetCore/ExternalLoginProvider_Tests.cs | 40 ++++++++++++++++++- .../AspNetCore/FakeExternalLoginProvider.cs | 18 +++++++-- 3 files changed, 61 insertions(+), 6 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/ExternalLoginProviderBase.cs b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/ExternalLoginProviderBase.cs index ca40510f3a..930718aa5b 100644 --- a/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/ExternalLoginProviderBase.cs +++ b/modules/identity/src/Volo.Abp.Identity.AspNetCore/Volo/Abp/Identity/AspNetCore/ExternalLoginProviderBase.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; +using Volo.Abp.Domain.Repositories; using Volo.Abp.Guids; using Volo.Abp.MultiTenancy; @@ -14,16 +15,20 @@ namespace Volo.Abp.Identity.AspNetCore protected IdentityUserManager UserManager { get; } protected RandomPasswordGenerator RandomPasswordGenerator { get; } + protected IIdentityUserRepository IdentityUserRepository { get; } + protected ExternalLoginProviderBase( IGuidGenerator guidGenerator, ICurrentTenant currentTenant, IdentityUserManager userManager, - RandomPasswordGenerator randomPasswordGenerator) + RandomPasswordGenerator randomPasswordGenerator, + IIdentityUserRepository identityUserRepository) { GuidGenerator = guidGenerator; CurrentTenant = currentTenant; UserManager = userManager; RandomPasswordGenerator = randomPasswordGenerator; + IdentityUserRepository = identityUserRepository; } public abstract Task TryAuthenticateAsync(string userName, string plainPassword); @@ -113,6 +118,8 @@ namespace Volo.Abp.Identity.AspNetCore (await UserManager.SetTwoFactorEnabledAsync(user, externalUser.TwoFactorEnabled.Value)).CheckErrors(); } + await IdentityUserRepository.EnsureCollectionLoadedAsync(user, u => u.Logins); + var userLogin = user.Logins.FirstOrDefault(l => l.LoginProvider == providerName); if (userLogin != null) { diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/ExternalLoginProvider_Tests.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/ExternalLoginProvider_Tests.cs index 89e12d47a1..da0178a819 100644 --- a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/ExternalLoginProvider_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/ExternalLoginProvider_Tests.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Linq; +using System.Threading.Tasks; using Shouldly; using Xunit; @@ -9,11 +10,48 @@ namespace Volo.Abp.Identity.AspNetCore [Fact] public async Task Should_SignIn_With_ExternalLoginProvider() { + // User does not exists yet + (await GetRequiredService().FindByNameAsync("ext_user")).ShouldBeNull(); + + // Try to login + var result = await GetResponseAsStringAsync( "api/signin-test/password?userName=ext_user&password=abc" ); result.ShouldBe("Succeeded"); + + // User should be created now + + await CheckUserAsync(); + + // Re-login + + result = await GetResponseAsStringAsync( + "api/signin-test/password?userName=ext_user&password=abc" + ); + + result.ShouldBe("Succeeded"); + + await CheckUserAsync(); + } + + private async Task CheckUserAsync() + { + var userRepository = GetRequiredService(); + + var user = await userRepository.FindByNormalizedUserNameAsync("EXT_USER"); + user.Name.ShouldBe("Test Name"); + user.Surname.ShouldBe("Test Surname"); + user.EmailConfirmed.ShouldBeTrue(); + user.TwoFactorEnabled.ShouldBeFalse(); + user.PhoneNumber.ShouldBe("123"); + user.PhoneNumberConfirmed.ShouldBeFalse(); + user.LoginProvider.ShouldBe("Fake"); + + var logins = user.Logins.Where(l => l.LoginProvider == "Fake").ToList(); + logins.Count.ShouldBe(1); + logins[0].ProviderKey.ShouldBe("123"); } } } diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs index ae9bdb78bb..95eb3e6958 100644 --- a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo/Abp/Identity/AspNetCore/FakeExternalLoginProvider.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; using Volo.Abp.MultiTenancy; @@ -13,8 +14,14 @@ namespace Volo.Abp.Identity.AspNetCore IGuidGenerator guidGenerator, ICurrentTenant currentTenant, IdentityUserManager userManager, - RandomPasswordGenerator randomPasswordGenerator) - : base(guidGenerator, currentTenant, userManager, randomPasswordGenerator) + RandomPasswordGenerator randomPasswordGenerator, + IIdentityUserRepository identityUserRepository) + : base( + guidGenerator, + currentTenant, + userManager, + randomPasswordGenerator, + identityUserRepository) { } @@ -28,7 +35,10 @@ namespace Volo.Abp.Identity.AspNetCore protected override Task GetUserInfoAsync(string userName) { - // The only required property is the email, which is set in the constructor. + if (userName != "ext_user") + { + throw new ArgumentException(); + } return Task.FromResult( new ExternalLoginUserInfo("ext_user@test.com")