Ejemplo n.º 1
0
        public async Task <ResourceOwner> Execute(string phoneNumber)
        {
            if (string.IsNullOrWhiteSpace(phoneNumber))
            {
                throw new ArgumentNullException(nameof(phoneNumber));
            }

            // 1. Send the confirmation code (SMS).
            await _generateAndSendSmsCodeOperation.Execute(phoneNumber);

            // 2. Try to get the resource owner.
            var resourceOwner = await _resourceOwnerRepository.GetResourceOwnerByClaim(Core.Jwt.Constants.StandardResourceOwnerClaimNames.PhoneNumber, phoneNumber);

            if (resourceOwner != null)
            {
                return(resourceOwner);
            }

            // 3. Create a new resource owner.
            var claims = new List <Claim>
            {
                new Claim(Core.Jwt.Constants.StandardResourceOwnerClaimNames.PhoneNumber, phoneNumber),
                new Claim(Core.Jwt.Constants.StandardResourceOwnerClaimNames.PhoneNumberVerified, "false")
            };
            var record = new AddUserParameter(Guid.NewGuid().ToString(), claims);
            await _userActions.AddUser(record).ConfigureAwait(false);

            return(await _resourceOwnerRepository.GetResourceOwnerByClaim(Core.Jwt.Constants.StandardResourceOwnerClaimNames.PhoneNumber, phoneNumber));
        }
        public BaseResponse <bool> AddUser(AddUserParameter parameter)
        {
            BaseResponse <bool> response = new BaseResponse <bool>();

            try
            {
                HBUser user = new HBUser();
                user.UserToken      = parameter.UserToken;
                user.PWD            = parameter.PWD;
                user.RoleID         = parameter.RoleID;
                user.OrganizationID = parameter.OrganizationID;
                user.AddUserID      = parameter.AddUserID;
                user.LastUpdateDate = DateTime.Now;
                user.LastUpdateID   = parameter.AddUserID;

                OperationResult operationResult = hbUserReosiory.AddNew <HBUser>(user);
                if (operationResult.ResultType != EnumOperationResultType.Success)
                {
                    throw new Exception("添加用户异常");
                }

                return(response);
            }
            catch (Exception e)
            {
                response.IsSuccessful = false;
                return(response);
            }
            throw new NotImplementedException();
        }
        public static AddUserParameter ToAddUserParameter(this UpdateResourceOwnerViewModel updateResourceOwnerViewModel)
        {
            if (updateResourceOwnerViewModel == null)
            {
                throw new ArgumentNullException(nameof(updateResourceOwnerViewModel));
            }

            var result = new AddUserParameter
            {
                Login    = updateResourceOwnerViewModel.Login,
                Password = updateResourceOwnerViewModel.NewPassword
            };

            if (!string.IsNullOrWhiteSpace(updateResourceOwnerViewModel.Name))
            {
                result.Claims.Add(new Claim(Core.Jwt.Constants.StandardResourceOwnerClaimNames.Name, updateResourceOwnerViewModel.Name));
            }

            if (!string.IsNullOrWhiteSpace(updateResourceOwnerViewModel.Email))
            {
                result.Claims.Add(new Claim(Core.Jwt.Constants.StandardResourceOwnerClaimNames.Email, updateResourceOwnerViewModel.Email));
            }

            if (!string.IsNullOrWhiteSpace(updateResourceOwnerViewModel.PhoneNumber))
            {
                result.Claims.Add(new Claim(Core.Jwt.Constants.StandardResourceOwnerClaimNames.PhoneNumber, updateResourceOwnerViewModel.PhoneNumber));
            }

            return(result);
        }
Ejemplo n.º 4
0
        public BaseResponse <bool> AddUser(AddUserParameter parameter)
        {
            BaseResponse <bool> response = new BaseResponse <bool>();

            try
            {
                #region 输入合法性验证
                if (string.IsNullOrEmpty(parameter.UserToken))
                {
                    response.IsSuccessful = false;
                    response.Reason       = "账户ID不能为空";
                    return(response);
                }

                if (string.IsNullOrEmpty(parameter.PWD))
                {
                    response.IsSuccessful = false;
                    response.Reason       = "账户密码不能为空";
                    return(response);
                }
                if (parameter.PWD.Length < 6)
                {
                    response.IsSuccessful = false;
                    response.Reason       = "密码长度至少是6位";
                    return(response);
                }

                var isExisted = hbUserReosiory.GetDatas <HBUser>(t => !t.IsDeleted && !string.IsNullOrEmpty(t.UserToken) && t.UserToken.Equals(parameter.UserToken), true).Any();
                if (isExisted)
                {
                    response.IsSuccessful = false;
                    response.Reason       = "账户已存在";
                    return(response);
                }
                #endregion

                HBUser user = new HBUser();
                user.UserToken        = parameter.UserToken;
                user.PWD              = MD5Helper.MD5Encrypt64(Utilitys.DecodeBase64("UTF-8", parameter.PWD));//密码MD5加密
                user.RoleID           = parameter.RoleID;
                user.OrganizationID   = parameter.OrganizationID;
                user.AddUserID        = parameter.AddUserID;
                user.LastUpdateDate   = DateTime.Now;
                user.LastUpdateUserID = parameter.AddUserID;
                user.UseStatus        = true;

                OperationResult operationResult = hbUserReosiory.AddNew <HBUser>(user);
                if (operationResult.ResultType != EnumOperationResultType.Success)
                {
                    throw new Exception("添加用户异常");
                }

                return(response);
            }
            catch (Exception e)
            {
                response.IsSuccessful = false;
                return(response);
            }
        }
 public async Task<bool> Add(AddUserParameter parameter)
 {
     _managerEventSource.StartToAddResourceOwner(parameter.Login);
     _addUserParameterValidator.Validate(parameter);
     var result = await _addUserOperation.Execute(parameter, null);
     _managerEventSource.FinishToAddResourceOwner(parameter.Login);
     return result;
 }
        public async Task <bool> Execute(AddUserParameter addUserParameter)
        {
            if (addUserParameter == null)
            {
                throw new ArgumentNullException(nameof(addUserParameter));
            }

            if (string.IsNullOrEmpty(addUserParameter.Login))
            {
                throw new ArgumentNullException(nameof(addUserParameter.Login));
            }

            if (string.IsNullOrWhiteSpace(addUserParameter.Password))
            {
                throw new ArgumentNullException(nameof(addUserParameter.Password));
            }

            if (await _authenticateResourceOwnerService.AuthenticateResourceOwnerAsync(addUserParameter.Login,
                                                                                       addUserParameter.Password) != null)
            {
                throw new IdentityServerException(
                          Errors.ErrorCodes.UnhandledExceptionCode,
                          Errors.ErrorDescriptions.TheRoWithCredentialsAlreadyExists);
            }

            var newClaims = new List <Claim>
            {
                new Claim(Jwt.Constants.StandardResourceOwnerClaimNames.UpdatedAt, DateTime.UtcNow.ToString()),
                new Claim(Jwt.Constants.StandardResourceOwnerClaimNames.Subject, addUserParameter.Login)
            };
            var newResourceOwner = new ResourceOwner
            {
                Id     = addUserParameter.Login,
                Claims = newClaims,
                TwoFactorAuthentication = TwoFactorAuthentications.NONE,
                IsLocalAccount          = true,
                Password = _authenticateResourceOwnerService.GetHashedPassword(addUserParameter.Password)
            };
            var claims = (await _claimRepository.GetAllAsync()).Select(c => c.Code);

            if (addUserParameter.Claims != null)
            {
                foreach (var claim in addUserParameter.Claims.Where(c => claims.Contains(c.Type)))
                {
                    newResourceOwner.Claims.Add(claim);
                }
            }

            if (!newResourceOwner.Claims.Any(c => c.Type == Jwt.Constants.StandardResourceOwnerClaimNames.Subject))
            {
                newResourceOwner.Claims.Add(new Claim(Jwt.Constants.StandardResourceOwnerClaimNames.Subject, addUserParameter.Login));
            }

            await _resourceOwnerRepository.InsertAsync(newResourceOwner);

            return(true);
        }
        public async Task <ResourceOwner> Execute(string phoneNumber, string authenticatedUserSubject = null)
        {
            if (string.IsNullOrWhiteSpace(phoneNumber))
            {
                throw new ArgumentNullException(nameof(phoneNumber));
            }

            // 1. Check user exists
            ResourceOwner resourceOwner = null;

            if (!string.IsNullOrWhiteSpace(authenticatedUserSubject))
            {
                resourceOwner = await _userActions.GetUser(authenticatedUserSubject).ConfigureAwait(false);

                if (!resourceOwner.Claims.Any(c => c.Type == Core.Jwt.Constants.StandardResourceOwnerClaimNames.PhoneNumber && c.Value == phoneNumber))
                {
                    throw new InvalidOperationException("the phone number is not valid");
                }
            }
            else
            {
                resourceOwner = await _userActions.GetUserByClaim(Core.Jwt.Constants.StandardResourceOwnerClaimNames.PhoneNumber, phoneNumber);
            }

            if (!_smsAuthenticationOptions.IsSelfProvisioningEnabled && resourceOwner == null)
            {
                throw new InvalidOperationException("the user doesn't exist");
            }

            // 2. Send the confirmation code (SMS).
            await _generateAndSendSmsCodeOperation.Execute(phoneNumber);

            if (resourceOwner != null)
            {
                return(resourceOwner);
            }

            // 3. Create a new resource owner.
            var claims = new List <Claim>
            {
                new Claim(Core.Jwt.Constants.StandardResourceOwnerClaimNames.PhoneNumber, phoneNumber),
                new Claim(Core.Jwt.Constants.StandardResourceOwnerClaimNames.PhoneNumberVerified, "false")
            };
            var record = new AddUserParameter(claims);
            await _userActions.AddUser(record).ConfigureAwait(false);

            return(await _userActions.GetUserByClaim(Core.Jwt.Constants.StandardResourceOwnerClaimNames.PhoneNumber, phoneNumber));
        }
        public BaseResponse <bool> AddUser(AddUserParameter parameter)
        {
            if (Validate(parameter))
            {
                return(userManager.AddUser(parameter));
            }
            else
            {
                BaseResponse <bool> response = new BaseResponse <bool>();
                response.IsSuccessful = false;
                response.Code         = "JWT_ERR";
                response.Reason       = "JWT_ERR";

                return(response);
            }
        }
        public void Validate(AddUserParameter parameter)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }

            if (string.IsNullOrWhiteSpace(parameter.Login))
            {
                throw new IdentityServerManagerException(ErrorCodes.InvalidRequestCode, string.Format(ErrorDescriptions.TheParameterIsMissing, "login"));
            }

            if (string.IsNullOrWhiteSpace(parameter.Password))
            {
                throw new IdentityServerManagerException(ErrorCodes.InvalidRequestCode, string.Format(ErrorDescriptions.TheParameterIsMissing, "password"));
            }
        }
        public async Task When_ResourceOwner_With_Same_Credentials_Exists_Then_Exception_Is_Thrown()
        {
            // ARRANGE
            InitializeFakeObjects();
            var parameter = new AddUserParameter(null);

            _resourceOwnerRepositoryStub.Setup(r => r.GetAsync(It.IsAny <string>()))
            .Returns(Task.FromResult(new ResourceOwner()));

            // ACT
            var exception = await Assert.ThrowsAsync <IdentityServerException>(() => _addResourceOwnerAction.Execute(parameter, null));

            // ASSERTS
            Assert.NotNull(exception);
            Assert.True(exception.Code == ErrorCodes.UnhandledExceptionCode);
            Assert.True(exception.Message == ErrorDescriptions.TheRoWithCredentialsAlreadyExists);
        }
        public async Task When_ResourceOwner_Cannot_Be_Added_Then_Exception_Is_Thrown()
        {
            // ARRANGE
            InitializeFakeObjects();
            _subjectBuilderStub.Setup(s => s.BuildSubject()).Returns(Task.FromResult("sub")); _accountFilterStub.Setup(s => s.Check(It.IsAny <IEnumerable <Claim> >())).Returns(Task.FromResult(new AccountFilterResult
            {
                IsValid = true
            }));
            _resourceOwnerRepositoryStub.Setup(r => r.InsertAsync(It.IsAny <ResourceOwner>())).Returns(Task.FromResult(false));
            var parameter = new AddUserParameter(null);

            // ACT
            var exception = await Assert.ThrowsAsync <IdentityServerException>(() => _addResourceOwnerAction.Execute(parameter, null));

            // ASSERTS
            Assert.NotNull(exception);
            Assert.Equal("unhandled_exception", exception.Code);
            Assert.Equal("An error occured while trying to insert the resource owner", exception.Message);
        }
        public async Task When_Add_ResourceOwner_Then_Operation_Is_Called()
        {
            // ARRANGE
            InitializeFakeObjects();
            var parameter = new AddUserParameter
            {
                Login    = "******",
                Password = "******"
            };

            _authenticateResourceOwnerServiceStub.Setup(r => r.AuthenticateResourceOwnerAsync(It.IsAny <string>(), It.IsAny <string>()))
            .Returns(Task.FromResult((ResourceOwner)null));

            // ACT
            await _addResourceOwnerAction.Execute(parameter);

            // ASSERT
            _resourceOwnerRepositoryStub.Verify(r => r.InsertAsync(It.IsAny <ResourceOwner>()));
        }
        public async Task Execute(AddUserParameter addUserParameter)
        {
            if (addUserParameter == null)
            {
                throw new ArgumentNullException(nameof(addUserParameter));
            }

            if (string.IsNullOrEmpty(addUserParameter.Login))
            {
                throw new ArgumentNullException(nameof(addUserParameter.Login));
            }

            if (string.IsNullOrWhiteSpace(addUserParameter.Password))
            {
                throw new ArgumentNullException(nameof(addUserParameter.Password));
            }

            if (await _authenticateResourceOwnerService.AuthenticateResourceOwnerAsync(addUserParameter.Login,
                                                                                       addUserParameter.Password) != null)
            {
                throw new IdentityServerException(
                          Errors.ErrorCodes.UnhandledExceptionCode,
                          Errors.ErrorDescriptions.TheRoWithCredentialsAlreadyExists);
            }

            var claims = new List <Claim>
            {
                new Claim(Jwt.Constants.StandardResourceOwnerClaimNames.UpdatedAt, DateTime.UtcNow.ToString()),
                new Claim(Jwt.Constants.StandardResourceOwnerClaimNames.Subject, addUserParameter.Login)
            };
            var newResourceOwner = new ResourceOwner
            {
                Id     = addUserParameter.Login,
                Claims = claims,
                TwoFactorAuthentication = TwoFactorAuthentications.NONE,
                IsLocalAccount          = true,
                Password = _authenticateResourceOwnerService.GetHashedPassword(addUserParameter.Password)
            };
            await _resourceOwnerRepository.InsertAsync(newResourceOwner);
        }
        public async Task When_Add_ResourceOwner_Then_Operation_Is_Called()
        {
            // ARRANGE
            InitializeFakeObjects();
            var parameter = new AddUserParameter(new List <Claim>());

            _accountFilterStub.Setup(s => s.Check(It.IsAny <IEnumerable <Claim> >())).Returns(Task.FromResult(new AccountFilterResult
            {
                IsValid = true
            }));
            _subjectBuilderStub.Setup(s => s.BuildSubject()).Returns(Task.FromResult("sub"));
            _resourceOwnerRepositoryStub.Setup(r => r.GetAsync(It.IsAny <string>()))
            .Returns(Task.FromResult((ResourceOwner)null));
            _resourceOwnerRepositoryStub.Setup(r => r.InsertAsync(It.IsAny <ResourceOwner>())).Returns(Task.FromResult(true));

            // ACT
            await _addResourceOwnerAction.Execute(parameter, null);

            // ASSERT
            _resourceOwnerRepositoryStub.Verify(r => r.InsertAsync(It.IsAny <ResourceOwner>()));
            _openidEventSourceStub.Verify(o => o.AddResourceOwner("sub"));
        }
Ejemplo n.º 15
0
        /// <summary>
        /// Add an external account.
        /// </summary>
        /// <param name="authenticatedUser"></param>
        /// <returns></returns>
        protected async Task <string> AddExternalUser(ClaimsPrincipal authenticatedUser)
        {
            var openidClaims = authenticatedUser.Claims.ToOpenidClaims().ToList();

            if (_basicAuthenticateOptions.ClaimsIncludedInUserCreation != null && _basicAuthenticateOptions.ClaimsIncludedInUserCreation.Any())
            {
                var lstIndexesToRemove = openidClaims.Where(oc => !_basicAuthenticateOptions.ClaimsIncludedInUserCreation.Contains(oc.Type))
                                         .Select(oc => openidClaims.IndexOf(oc))
                                         .OrderByDescending(oc => oc);
                foreach (var index in lstIndexesToRemove)
                {
                    openidClaims.RemoveAt(index);
                }
            }

            var record = new AddUserParameter(openidClaims)
            {
                ExternalLogin = authenticatedUser.Claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value
            };

            return(await _userActions.AddUser(record, authenticatedUser.Identity.AuthenticationType).ConfigureAwait(false));
        }
Ejemplo n.º 16
0
        public async Task <string> Execute(AddUserParameter addUserParameter, string issuer = null)
        {
            if (addUserParameter == null)
            {
                throw new ArgumentNullException(nameof(addUserParameter));
            }

            var subject = await _subjectBuilder.BuildSubject().ConfigureAwait(false);

            // 1. Check the resource owner already exists.
            if (await _resourceOwnerRepository.GetAsync(subject) != null)
            {
                throw new IdentityServerException(Errors.ErrorCodes.UnhandledExceptionCode, Errors.ErrorDescriptions.TheRoWithCredentialsAlreadyExists);
            }

            var newClaims = new List <Claim>
            {
                new Claim(Jwt.Constants.StandardResourceOwnerClaimNames.UpdatedAt, DateTime.UtcNow.ToString()),
                new Claim(Jwt.Constants.StandardResourceOwnerClaimNames.Subject, subject)
            };

            // 2. Populate the claims.
            var existedClaims = await _claimRepository.GetAllAsync().ConfigureAwait(false);

            if (addUserParameter.Claims != null)
            {
                foreach (var claim in addUserParameter.Claims)
                {
                    if (!newClaims.Any(nc => nc.Type == claim.Type) && existedClaims.Any(c => c.Code == claim.Type))
                    {
                        newClaims.Add(claim);
                    }
                }
            }

            var isFilterValid    = true;
            var userFilterResult = await _accountFilter.Check(newClaims).ConfigureAwait(false);

            if (!userFilterResult.IsValid)
            {
                isFilterValid = false;
                foreach (var ruleResult in userFilterResult.AccountFilterRules)
                {
                    if (!ruleResult.IsValid)
                    {
                        _openidEventSource.Failure($"the filter rule '{ruleResult.RuleName}' failed");
                        foreach (var errorMessage in ruleResult.ErrorMessages)
                        {
                            _openidEventSource.Failure(errorMessage);
                        }
                    }
                }
            }

            if (!isFilterValid)
            {
                throw new IdentityServerException(Errors.ErrorCodes.InternalError, Errors.ErrorDescriptions.TheUserIsNotAuthorized);
            }

            // 3. Add the scim resource.
            if (_userClaimsEnricherLst != null)
            {
                foreach (var userClaimsEnricher in _userClaimsEnricherLst)
                {
                    await userClaimsEnricher.Enrich(newClaims).ConfigureAwait(false);
                }
            }

            // 4. Add the resource owner.
            var newResourceOwner = new ResourceOwner
            {
                Id             = subject,
                Claims         = newClaims,
                CreateDateTime = DateTime.UtcNow,
                UpdateDateTime = DateTime.UtcNow,
                IsBlocked      = false
            };

            if (!await _resourceOwnerRepository.InsertAsync(newResourceOwner).ConfigureAwait(false))
            {
                throw new IdentityServerException(Errors.ErrorCodes.UnhandledExceptionCode, Errors.ErrorDescriptions.TheResourceOwnerCannotBeAdded);
            }

            // 5. Add credentials.
            if (addUserParameter.Credentials != null)
            {
                foreach (var c in addUserParameter.Credentials)
                {
                    c.UserId = subject;
                }

                await _addUserCredentialsOperation.Execute(addUserParameter.Credentials).ConfigureAwait(false);
            }

            // 6. Link to a profile.
            if (!string.IsNullOrWhiteSpace(issuer))
            {
                await _linkProfileAction.Execute(subject, addUserParameter.ExternalLogin, issuer).ConfigureAwait(false);
            }

            _openidEventSource.AddResourceOwner(newResourceOwner.Id);
            return(subject);
        }
Ejemplo n.º 17
0
 public async Task AddResourceOwner(AddUserParameter addUserParameter)
 {
     await _addResourceOwnerAction.Execute(addUserParameter);
 }
Ejemplo n.º 18
0
 public Task <string> AddUser(AddUserParameter addUserParameter, string issuer = null)
 {
     return(_addUserOperation.Execute(addUserParameter, issuer));
 }
Ejemplo n.º 19
0
 public Task <bool> AddUser(AddUserParameter claimsPrincipal)
 {
     return(_addUserOperation.Execute(claimsPrincipal));
 }
 public Task Add(AddUserParameter parameter)
 {
     return(_addResourceOwnerAction.Execute(parameter));
 }
Ejemplo n.º 21
0
 public BaseResponse <bool> AddUser(AddUserParameter parameter)
 {
     return(userManager.AddUser(parameter));
 }