GenerateRecoveryCodes.cshtml.cs 3.1 KB

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