Email.cshtml.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT license.
  3. #nullable disable
  4. using System;
  5. using System.ComponentModel.DataAnnotations;
  6. using System.Text;
  7. using System.Text.Encodings.Web;
  8. using System.Threading.Tasks;
  9. using bitforum.Models.User;
  10. using Microsoft.AspNetCore.Identity;
  11. using Microsoft.AspNetCore.Identity.UI.Services;
  12. using Microsoft.AspNetCore.Mvc;
  13. using Microsoft.AspNetCore.Mvc.RazorPages;
  14. using Microsoft.AspNetCore.WebUtilities;
  15. namespace bitforum.Areas.Identity.Pages.Account.Manage
  16. {
  17. public class EmailModel : PageModel
  18. {
  19. private readonly UserManager<ApplicationUser> _userManager;
  20. private readonly SignInManager<ApplicationUser> _signInManager;
  21. private readonly IEmailSender _emailSender;
  22. public EmailModel(
  23. UserManager<ApplicationUser> userManager,
  24. SignInManager<ApplicationUser> signInManager,
  25. IEmailSender emailSender)
  26. {
  27. _userManager = userManager;
  28. _signInManager = signInManager;
  29. _emailSender = emailSender;
  30. }
  31. /// <summary>
  32. /// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used
  33. /// directly from your code. This API may change or be removed in future releases.
  34. /// </summary>
  35. public string Email { get; set; }
  36. /// <summary>
  37. /// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used
  38. /// directly from your code. This API may change or be removed in future releases.
  39. /// </summary>
  40. public bool IsEmailConfirmed { get; set; }
  41. /// <summary>
  42. /// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used
  43. /// directly from your code. This API may change or be removed in future releases.
  44. /// </summary>
  45. [TempData]
  46. public string StatusMessage { get; set; }
  47. /// <summary>
  48. /// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used
  49. /// directly from your code. This API may change or be removed in future releases.
  50. /// </summary>
  51. [BindProperty]
  52. public InputModel Input { get; set; }
  53. /// <summary>
  54. /// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used
  55. /// directly from your code. This API may change or be removed in future releases.
  56. /// </summary>
  57. public class InputModel
  58. {
  59. /// <summary>
  60. /// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used
  61. /// directly from your code. This API may change or be removed in future releases.
  62. /// </summary>
  63. [Required]
  64. [EmailAddress]
  65. [Display(Name = "New email")]
  66. public string NewEmail { get; set; }
  67. }
  68. private async Task LoadAsync(ApplicationUser user)
  69. {
  70. var email = await _userManager.GetEmailAsync(user);
  71. Email = email;
  72. Input = new InputModel
  73. {
  74. NewEmail = email,
  75. };
  76. IsEmailConfirmed = await _userManager.IsEmailConfirmedAsync(user);
  77. }
  78. public async Task<IActionResult> OnGetAsync()
  79. {
  80. var user = await _userManager.GetUserAsync(User);
  81. if (user == null)
  82. {
  83. return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
  84. }
  85. await LoadAsync(user);
  86. return Page();
  87. }
  88. public async Task<IActionResult> OnPostChangeEmailAsync()
  89. {
  90. var user = await _userManager.GetUserAsync(User);
  91. if (user == null)
  92. {
  93. return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
  94. }
  95. if (!ModelState.IsValid)
  96. {
  97. await LoadAsync(user);
  98. return Page();
  99. }
  100. var email = await _userManager.GetEmailAsync(user);
  101. if (Input.NewEmail != email)
  102. {
  103. var userId = await _userManager.GetUserIdAsync(user);
  104. var code = await _userManager.GenerateChangeEmailTokenAsync(user, Input.NewEmail);
  105. code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
  106. var callbackUrl = Url.Page(
  107. "/Account/ConfirmEmailChange",
  108. pageHandler: null,
  109. values: new { area = "Identity", userId = userId, email = Input.NewEmail, code = code },
  110. protocol: Request.Scheme);
  111. await _emailSender.SendEmailAsync(
  112. Input.NewEmail,
  113. "Confirm your email",
  114. $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
  115. StatusMessage = "Confirmation link to change email sent. Please check your email.";
  116. return RedirectToPage();
  117. }
  118. StatusMessage = "Your email is unchanged.";
  119. return RedirectToPage();
  120. }
  121. public async Task<IActionResult> OnPostSendVerificationEmailAsync()
  122. {
  123. var user = await _userManager.GetUserAsync(User);
  124. if (user == null)
  125. {
  126. return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
  127. }
  128. if (!ModelState.IsValid)
  129. {
  130. await LoadAsync(user);
  131. return Page();
  132. }
  133. var userId = await _userManager.GetUserIdAsync(user);
  134. var email = await _userManager.GetEmailAsync(user);
  135. var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
  136. code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
  137. var callbackUrl = Url.Page(
  138. "/Account/ConfirmEmail",
  139. pageHandler: null,
  140. values: new { area = "Identity", userId = userId, code = code },
  141. protocol: Request.Scheme);
  142. await _emailSender.SendEmailAsync(
  143. email,
  144. "Confirm your email",
  145. $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
  146. StatusMessage = "Verification email sent. Please check your email.";
  147. return RedirectToPage();
  148. }
  149. }
  150. }