using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Abp.Domain.Services; using Abp.UI; using WeApp.Authorization.Roles; using WeApp.MultiTenancy; using IwbZero.Authorization.Base.Users; using IwbZero.IdentityFramework; using IwbZero.Runtime.Session; using Microsoft.AspNet.Identity; namespace WeApp.Authorization.Users { public class UserRegistrationManager : DomainService { public IIwbSession AbpSession { get; set; } private readonly TenantManager _tenantManager; private readonly UserManager _userManager; private readonly RoleManager _roleManager; public UserRegistrationManager( TenantManager tenantManager, UserManager userManager, RoleManager roleManager) { _tenantManager = tenantManager; _userManager = userManager; _roleManager = roleManager; AbpSession = NullIwbSession.Instance; } public async Task RegisterAsync(string name, string surname, string emailAddress, string userName, string plainPassword, bool isEmailConfirmed) { CheckForTenant(); var tenant = await GetActiveTenantAsync(); var user = new User { TenantId = tenant.Id, Name = name, Surname = surname, EmailAddress = emailAddress, IsActive = true, UserName = userName, IsEmailConfirmed = true, Roles = new List() }; user.Password = new PasswordHasher().HashPassword(plainPassword); foreach (var defaultRole in _roleManager.Roles.Where(r => r.IsDefault).ToList()) { user.Roles.Add(new UserRole(tenant.Id, user.Id, defaultRole.Id)); } CheckErrors(await _userManager.CreateAsync(user)); await CurrentUnitOfWork.SaveChangesAsync(); return user; } private void CheckForTenant() { if (!AbpSession.TenantId.HasValue) { throw new InvalidOperationException("Can not register host users!"); } } private async Task GetActiveTenantAsync() { if (!AbpSession.TenantId.HasValue) { return null; } return await GetActiveTenantAsync(AbpSession.TenantId.Value); } private async Task GetActiveTenantAsync(int tenantId) { var tenant = await _tenantManager.FindByIdAsync(tenantId); if (tenant == null) { throw new UserFriendlyException(L("UnknownTenantId{0}", tenantId)); } if (!tenant.IsActive) { throw new UserFriendlyException(L("TenantIdIsNotActive{0}", tenantId)); } return tenant; } protected virtual void CheckErrors(IdentityResult identityResult) { identityResult.CheckErrors(LocalizationManager); } } }