GenerateRecoveryCodes.cshtml.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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.Linq;
  6. using System.Threading.Tasks;
  7. using Microsoft.AspNetCore.Identity;
  8. using Microsoft.AspNetCore.Mvc;
  9. using Microsoft.AspNetCore.Mvc.RazorPages;
  10. using Microsoft.Extensions.Logging;
  11. namespace bitforum.Areas.Identity.Pages.Account.Manage
  12. {
  13. public class GenerateRecoveryCodesModel : PageModel
  14. {
  15. private readonly UserManager<IdentityUser> _userManager;
  16. private readonly ILogger<GenerateRecoveryCodesModel> _logger;
  17. public GenerateRecoveryCodesModel(
  18. UserManager<IdentityUser> userManager,
  19. ILogger<GenerateRecoveryCodesModel> logger)
  20. {
  21. _userManager = userManager;
  22. _logger = logger;
  23. }
  24. /// <summary>
  25. /// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used
  26. /// directly from your code. This API may change or be removed in future releases.
  27. /// </summary>
  28. [TempData]
  29. public string[] RecoveryCodes { get; set; }
  30. /// <summary>
  31. /// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used
  32. /// directly from your code. This API may change or be removed in future releases.
  33. /// </summary>
  34. [TempData]
  35. public string StatusMessage { get; set; }
  36. public async Task<IActionResult> OnGetAsync()
  37. {
  38. var user = await _userManager.GetUserAsync(User);
  39. if (user == null)
  40. {
  41. return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
  42. }
  43. var isTwoFactorEnabled = await _userManager.GetTwoFactorEnabledAsync(user);
  44. if (!isTwoFactorEnabled)
  45. {
  46. throw new InvalidOperationException($"Cannot generate recovery codes for user because they do not have 2FA enabled.");
  47. }
  48. return Page();
  49. }
  50. public async Task<IActionResult> OnPostAsync()
  51. {
  52. var user = await _userManager.GetUserAsync(User);
  53. if (user == null)
  54. {
  55. return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
  56. }
  57. var isTwoFactorEnabled = await _userManager.GetTwoFactorEnabledAsync(user);
  58. var userId = await _userManager.GetUserIdAsync(user);
  59. if (!isTwoFactorEnabled)
  60. {
  61. throw new InvalidOperationException($"Cannot generate recovery codes for user as they do not have 2FA enabled.");
  62. }
  63. var recoveryCodes = await _userManager.GenerateNewTwoFactorRecoveryCodesAsync(user, 10);
  64. RecoveryCodes = recoveryCodes.ToArray();
  65. _logger.LogInformation("User with ID '{UserId}' has generated new 2FA recovery codes.", userId);
  66. StatusMessage = "You have generated new recovery codes.";
  67. return RedirectToPage("./ShowRecoveryCodes");
  68. }
  69. }
  70. }