コード例 #1
0
        public async Task <IActionResult> PostAsync([FromBody] UsersPost model)
        {
            if (await cachedUserManager.GetUserByUserNameAndFilterRoleAssignmentsByClientIdAsync(model.UserName, userPrincipalBuilder.GetCurrentClientId()) != null)
            {
                throw new UserAlreadyExistsException();
            }

            if (await userManager.Users.FirstOrDefaultAsync(u => u.NormalizedEmail == model.Email.Trim().ToUpper()) != null)
            {
                throw new EmailAlreadyExistsException();
            }

            if (!hiringTypes.Contains(model.HiringType))
            {
                throw new InvalidHiringTypeException();
            }

            var user = mapper.Map <UsersPost, ApplicationUser>(model);

            user.EmailConfirmed = !model.GeneratePassword && string.IsNullOrWhiteSpace(model.Password);

            var password = model.GeneratePassword
                ? passwordGenerator.GenerateRandomPassword()
                : model.Password;

            var creationResult = !string.IsNullOrWhiteSpace(password)
                ? await userManager.CreateAsync(user, password)
                : await userManager.CreateAsync(user);

            if (creationResult.Succeeded)
            {
                if (!user.EmailConfirmed)
                {
                    var token = await userManager.GenerateEmailConfirmationTokenAsync(user);

                    var callbackUrl = Url.RouteUrl("ConfirmEmail", new { username = user.UserName, token }, Request.Scheme);

                    await emailSender.NotifyNewUserAsync(model.Email, model.UserName, callbackUrl, model.GeneratePassword?password : null);
                }

                return(CreatedAtRoute("UsersGet", new { username = user.UserName }, new PostResult(user.Id, user.UserName)));
            }
            else
            {
                throw new IdentityOperationException(creationResult.Errors.Select(e => new IdentityOperationExceptionItem(e.Code, e.Description)));
            }
        }