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()); }
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()); }