diff --git a/shesha-core/src/Shesha.Application/Authorization/TokenAuthController.cs b/shesha-core/src/Shesha.Application/Authorization/TokenAuthController.cs index a436180856..a4d574decd 100644 --- a/shesha-core/src/Shesha.Application/Authorization/TokenAuthController.cs +++ b/shesha-core/src/Shesha.Application/Authorization/TokenAuthController.cs @@ -24,6 +24,7 @@ using System.Linq; using System.Security.Claims; using System.Threading.Tasks; +using System.Transactions; namespace Shesha.Authorization { @@ -39,13 +40,14 @@ public class TokenAuthController : SheshaControllerBase private readonly IRepository _userRegistration; private readonly IExternalAuthConfiguration _externalAuthConfiguration; private readonly IExternalAuthManager _externalAuthManager; - private readonly UserRegistrationManager _userRegistrationManager; + private readonly IUserRegistrationManager _userRegistrationManager; private readonly IRepository _personRepository; private readonly IRepository _mobileDeviceRepository; private readonly ITokenBlacklistService _tokenBlacklistService; private readonly UserManager _userManager; private readonly AbpUserClaimsPrincipalFactory _claimsPrincipalFactory; private readonly IConfiguration _appConfiguration; + private readonly IRepository _userRepository; public TokenAuthController( LogInManager logInManager, @@ -54,14 +56,15 @@ public TokenAuthController( TokenAuthConfiguration configuration, IExternalAuthConfiguration externalAuthConfiguration, IExternalAuthManager externalAuthManager, - UserRegistrationManager userRegistrationManager, + IUserRegistrationManager userRegistrationManager, IRepository personRepository, IRepository userRegistration, IRepository mobileDeviceRepository, ITokenBlacklistService tokenBlacklistService, UserManager userManager, AbpUserClaimsPrincipalFactory claimsPrincipalFactory, - IConfiguration appConfiguration) + IConfiguration appConfiguration, + IRepository userRepository) { _logInManager = logInManager; _tenantCache = tenantCache; @@ -77,6 +80,7 @@ public TokenAuthController( _userManager = userManager; _claimsPrincipalFactory = claimsPrincipalFactory; _appConfiguration = appConfiguration; + _userRepository = userRepository; } [HttpPost] @@ -110,7 +114,7 @@ public async Task AuthenticateAsync([FromBody] Authenti return authenticateResult; } - private async Task GetAuthenticateResultAsync(ShaLoginResult loginResult, string imei) + private async Task GetAuthenticateResultAsync(ShaLoginResult loginResult, string imei) { var validFrom = DateTime.UtcNow; var expiresOn = validFrom.Add(_configuration.Expiration); @@ -322,28 +326,30 @@ public async Task ExternalAuthenticateAsync([Fr private async Task RegisterExternalUserAsync(ExternalAuthUserInfo externalUser) { - var user = await _userRegistrationManager.RegisterAsync( - externalUser.Name, - externalUser.Surname, - externalUser.EmailAddress, - externalUser.EmailAddress, - Authorization.Users.User.CreateRandomPassword(), - true - ); - - user.Logins = new List + using (var uow = UnitOfWorkManager.Begin(TransactionScopeOption.RequiresNew)) { - new UserLogin + var user = await _userRegistrationManager.RegisterAsync( + externalUser.Name, + externalUser.Surname, + externalUser.EmailAddress, + externalUser.EmailAddress, + Authorization.Users.User.CreateRandomPassword(), + true + ); + + user.Logins.Add(new UserLogin { LoginProvider = externalUser.Provider, ProviderKey = externalUser.ProviderKey, - TenantId = user.TenantId - } - }; + TenantId = user.TenantId, + UserId = user.Id + }); - await CurrentUnitOfWork.SaveChangesAsync(); + await _userRepository.UpdateAsync(user); + await uow.CompleteAsync(); - return user; + return user; + } } private async Task GetExternalUserInfoAsync(ExternalAuthenticateModel model) @@ -381,7 +387,7 @@ private async Task> GetLoginResultAsync(string usernameOrEm } } - private string CreateAccessToken(IEnumerable claims) + private string CreateAccessToken(IEnumerable claims) { var validFrom = DateTime.UtcNow; var expiresOn = validFrom.Add(_configuration.Expiration); diff --git a/shesha-core/src/Shesha.Framework/Authorization/Users/IUserRegistrationManager.cs b/shesha-core/src/Shesha.Framework/Authorization/Users/IUserRegistrationManager.cs new file mode 100644 index 0000000000..31629727da --- /dev/null +++ b/shesha-core/src/Shesha.Framework/Authorization/Users/IUserRegistrationManager.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using Abp.Domain.Services; + +namespace Shesha.Authorization.Users +{ + /// + /// Interface for user registration management + /// + public interface IUserRegistrationManager : IDomainService + { + /// + /// Registers a new user + /// + Task RegisterAsync(string name, string surname, string emailAddress, string userName, string plainPassword, bool isEmailConfirmed); + } +} diff --git a/shesha-core/src/Shesha.Framework/Authorization/Users/UserRegistrationManager.cs b/shesha-core/src/Shesha.Framework/Authorization/Users/UserRegistrationManager.cs index 5b79868c2c..a33c90a88e 100644 --- a/shesha-core/src/Shesha.Framework/Authorization/Users/UserRegistrationManager.cs +++ b/shesha-core/src/Shesha.Framework/Authorization/Users/UserRegistrationManager.cs @@ -9,35 +9,32 @@ using Abp.UI; using Microsoft.AspNetCore.Identity; using Shesha.Authorization.Roles; -using Shesha.Extensions; +using Shesha.Extensions; using Shesha.MultiTenancy; namespace Shesha.Authorization.Users { - public class UserRegistrationManager : DomainService + public class UserRegistrationManager : DomainService, IUserRegistrationManager { public IAbpSession AbpSession { get; set; } private readonly TenantManager _tenantManager; private readonly UserManager _userManager; private readonly RoleManager _roleManager; - private readonly IPasswordHasher _passwordHasher; public UserRegistrationManager( TenantManager tenantManager, UserManager userManager, - RoleManager roleManager, - IPasswordHasher passwordHasher) + RoleManager roleManager) { _tenantManager = tenantManager; _userManager = userManager; _roleManager = roleManager; - _passwordHasher = passwordHasher; AbpSession = NullAbpSession.Instance; } - public async Task RegisterAsync(string name, string surname, string emailAddress, string userName, string plainPassword, bool isEmailConfirmed) + public virtual async Task RegisterAsync(string name, string surname, string emailAddress, string userName, string plainPassword, bool isEmailConfirmed) { CheckForTenant(); @@ -56,7 +53,7 @@ public async Task RegisterAsync(string name, string surname, string emailA }; user.SetNormalizedNames(); - + foreach (var defaultRole in await _roleManager.Roles.Where(r => r.IsDefault).ToListAsync()) { user.Roles.Add(new UserRole(tenant.Id, user.Id, defaultRole.Id)); diff --git a/shesha-core/src/Shesha.Framework/SheshaFrameworkModule.cs b/shesha-core/src/Shesha.Framework/SheshaFrameworkModule.cs index 5887d4c136..44eb1ea14d 100644 --- a/shesha-core/src/Shesha.Framework/SheshaFrameworkModule.cs +++ b/shesha-core/src/Shesha.Framework/SheshaFrameworkModule.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Configuration; using Shesha.Authorization; +using Shesha.Authorization.Users; using Shesha.Configuration; using Shesha.Configuration.Email; using Shesha.Configuration.Security; @@ -85,6 +86,7 @@ public override void Initialize() IocManager.Register(DependencyLifeStyle.Transient); IocManager.Register(DependencyLifeStyle.Transient); + IocManager.Register(DependencyLifeStyle.Transient); IocManager.IocContainer.Register( Component.For().UsingFactoryMethod(f => {