Open Closed

Tenant Admin Password validation from Host login when we change Tenant password. #9002


User avatar
0
sghorakavi@cpat.com created

*** How do we call PasswordValidation in TenantController.cs similar to User password validation ? Any sample code ?***


2 Answer(s)
  • User Avatar
    0
    berkansasmaz created
    Support Team .NET Developer

    Hi,

    This is a known issue because SAAS and Identity are two separate modules, the password cannot be verified in the module.

    But you can custom it in your project:

    [Dependency(ReplaceServices = true)]
    [ExposeServices(typeof(ITenantAppService))]
    public class MyTenantAppService : TenantAppService
    {
        protected IOptions<IdentityOptions> IdentityOptions { get; }
        private IdentityUserManager _userManager;
    
        public MyTenantAppService(
            ITenantRepository tenantRepository,
            IEditionRepository editionRepository,
            ITenantManager tenantManager,
            IDataSeeder dataSeeder,
            IDistributedEventBus distributedEventBus,
            IOptions<AbpDbConnectionOptions> dbConnectionOptions,
            IConnectionStringChecker connectionStringChecker,
            IOptions<IdentityOptions> identityOptions, IdentityUserManager userManager) : base(tenantRepository, editionRepository, tenantManager, dataSeeder, distributedEventBus, dbConnectionOptions, connectionStringChecker)
        {
            IdentityOptions = identityOptions;
            _userManager = userManager;
        }
    
        public async override Task<SaasTenantDto> CreateAsync(SaasTenantCreateDto input)
        {
            if (!input.AdminPassword.IsNullOrWhiteSpace())
            {
                await ValidPasswordAsync(input.AdminPassword);
            }
    
            return await base.CreateAsync(input);
        }
    
        public async override Task SetPasswordAsync(Guid id, SaasTenantSetPasswordDto input)
        {
            await ValidPasswordAsync(input.Password);
            await base.SetPasswordAsync(id, input);
        }
    
        private async Task ValidPasswordAsync(string password)
        {
            var errors = new List<IdentityError>();
            var isValid = true;
            await IdentityOptions.SetAsync();
    
            foreach (var passwordValidator in _userManager.PasswordValidators)
            {
                var result = await passwordValidator.ValidateAsync(_userManager, null, password);
                if (!result.Succeeded)
                {
                    if (result.Errors.Any())
                    {
                        errors.AddRange(result.Errors);
                    }
    
                    isValid = false;
                }
            }
    
            if (!isValid)
            {
                IdentityResult.Failed(errors.ToArray()).CheckErrors();
            }
        }
    }
    

  • User Avatar
    0
    sghorakavi@cpat.com created

    Thank you berkansasmaz, It is working fine.

Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
Do you need assistance from an ABP expert?
Schedule a Meeting
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v9.3.0-preview. Updated on April 16, 2025, 12:13