public async Task <PasswordChangeResult> ChangeAsync(int CompanyId, int LoginUserId, string OldPassword, string NewPassword, CancellationToken token = default(CancellationToken))
        {
            var policy = await passwordPolicyProcessor.GetAsync(CompanyId, token);

            var oldHash = hashAlgorithm.Compute(policy.Convert(OldPassword));

            var password = await loginUserPasswordQueryProcessor.GetAsync(CompanyId, LoginUserId, token);

            if (password.PasswordHash != oldHash)
            {
                return(PasswordChangeResult.Failed);
            }

            var newHash = hashAlgorithm.Compute(policy.Convert(NewPassword));


            if (policy.HistoryCount > 0)
            {
                if (!password.Validate(newHash, policy.HistoryCount))
                {
                    return(PasswordChangeResult.ProhibitionSamePassword);
                }
            }

            var type = typeof(LoginUserPassword);

            for (var i = 9; i > 0; i--)
            {
                var nextHash  = type.GetProperty($"PasswordHash{i}");
                var prevHash  = type.GetProperty($"PasswordHash{(i - 1)}");
                var nextValue = policy.HistoryCount <= i
                    ? string.Empty
                    : prevHash.GetValue(password);
                nextHash.SetValue(password, nextValue);
            }

            if (policy.HistoryCount > 0)
            {
                password.PasswordHash0 = password.PasswordHash;
            }
            else
            {
                password.PasswordHash0 = string.Empty;
            }

            password.PasswordHash = newHash;
            await addLoginUserPasswordQueryProcessor.SaveAsync(password, token);

            return(PasswordChangeResult.Success);
        }
Beispiel #2
0
 private async Task InitializeLoginUserPasswordAsync(CompanySource source, LoginUser loginUser, CancellationToken token)
 {
     var hash     = hashAlgorithm.Compute(source.PasswordPolicy.Convert("password"));
     var password = new LoginUserPassword
     {
         LoginUserId  = loginUser.Id,
         PasswordHash = hash,
     };
     await addLoginUserPasswordQueryProcessor.SaveAsync(password);
 }