Exemplo n.º 1
0
        public async Task <IActionResult> UpdateEmail([FromBody] UpdateUserEmailRequest request)
        {
            var user = await _userManager.GetUserAsync(User);

            if (user == null)
            {
                return(NotFound());
            }
            var currentEmail = await _userManager.GetEmailAsync(user);

            if (currentEmail.Equals(request.Email, StringComparison.OrdinalIgnoreCase) && await _userManager.IsEmailConfirmedAsync(user))
            {
                ModelState.AddModelError(nameof(request.Email).ToLower(), _userManager.MessageDescriber.EmailAlreadyExists(request.Email));
                return(BadRequest(new ValidationProblemDetails(ModelState)));
            }
            var result = await _userManager.SetEmailAsync(user, request.Email);

            if (!result.Succeeded)
            {
                return(BadRequest(result.Errors.ToValidationProblemDetails()));
            }
            if (!_identityServerApiEndpointsOptions.Email.SendEmailOnUpdate)
            {
                return(NoContent());
            }
            if (_emailService == null)
            {
                var message = $"No concrete implementation of {nameof(IEmailService)} is registered. " +
                              $"Check {nameof(IndiceServicesServiceCollectionExtensions.AddEmailService)}, {nameof(ServiceCollectionExtensions.AddEmailServiceSmtpRazor)} or " +
                              $"{nameof(ServiceCollectionExtensions.AddEmailServiceSparkpost)} extensions on {nameof(IServiceCollection)} or provide your own implementation.";
                throw new Exception(message);
            }
            var token = await _userManager.GenerateEmailConfirmationTokenAsync(user);

            var data = new User {
                UserName = User.FindDisplayName() ?? user.UserName
            };
            await _emailService.SendAsync(message =>
                                          message.To(user.Email)
                                          .WithSubject(_userManager.MessageDescriber.UpdateEmailMessageSubject)
                                          .WithBody(_userManager.MessageDescriber.UpdateEmailMessageBody(user, token, request.ReturnUrl))
                                          .UsingTemplate(_identityServerApiEndpointsOptions.Email.TemplateName)
                                          .WithData(data));

            return(NoContent());
        }
Exemplo n.º 2
0
        public async Task <IActionResult> ResendConfirmationEmail([FromRoute] string userId)
        {
            var user = await _dbContext.Users.SingleOrDefaultAsync(x => x.Id == userId);

            if (user == null)
            {
                return(NotFound());
            }
            if (await _userManager.IsEmailConfirmedAsync(user))
            {
                ModelState.AddModelError(string.Empty, "User's email is already confirmed.");
                return(BadRequest(new ValidationProblemDetails(ModelState)));
            }
            var token = await _userManager.GenerateEmailConfirmationTokenAsync(user);

            var eventInfo = user.ToBasicUserInfo();
            await _eventService.Publish(new UserEmailConfirmationResendEvent(eventInfo, token));

            return(NoContent());
        }