-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
ce42bf4
commit 93c5ac8
Showing
42 changed files
with
2,137 additions
and
92 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
@page | ||
@model ChangePasswordModel | ||
@{ | ||
ViewData["Title"] = "Change password"; | ||
ViewData["ActivePage"] = ManageNavPages.ChangePassword; | ||
} | ||
|
||
<h3>@ViewData["Title"]</h3> | ||
<partial name="_StatusMessage" for="StatusMessage" /> | ||
<div class="row"> | ||
<div class="col-md-6"> | ||
<form id="change-password-form" method="post"> | ||
<div asp-validation-summary="ModelOnly" class="text-danger" role="alert"></div> | ||
<div class="form-floating mb-3"> | ||
<input asp-for="Input.OldPassword" class="form-control" autocomplete="current-password" aria-required="true" placeholder="Please enter your old password." /> | ||
<label asp-for="Input.OldPassword" class="form-label"></label> | ||
<span asp-validation-for="Input.OldPassword" class="text-danger"></span> | ||
</div> | ||
<div class="form-floating mb-3"> | ||
<input asp-for="Input.NewPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Please enter your new password." /> | ||
<label asp-for="Input.NewPassword" class="form-label"></label> | ||
<span asp-validation-for="Input.NewPassword" class="text-danger"></span> | ||
</div> | ||
<div class="form-floating mb-3"> | ||
<input asp-for="Input.ConfirmPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Please confirm your new password."/> | ||
<label asp-for="Input.ConfirmPassword" class="form-label"></label> | ||
<span asp-validation-for="Input.ConfirmPassword" class="text-danger"></span> | ||
</div> | ||
<button type="submit" class="w-100 btn btn-lg btn-primary">Update password</button> | ||
</form> | ||
</div> | ||
</div> | ||
|
||
@section Scripts { | ||
<partial name="_ValidationScriptsPartial" /> | ||
} |
127 changes: 127 additions & 0 deletions
127
Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
// Licensed to the .NET Foundation under one or more agreements. | ||
// The .NET Foundation licenses this file to you under the MIT license. | ||
#nullable disable | ||
|
||
using System; | ||
using System.ComponentModel.DataAnnotations; | ||
using System.Threading.Tasks; | ||
using Microsoft.AspNetCore.Identity; | ||
using Microsoft.AspNetCore.Mvc; | ||
using Microsoft.AspNetCore.Mvc.RazorPages; | ||
using Microsoft.Extensions.Logging; | ||
|
||
namespace SelenicSparkApp.Areas.Identity.Pages.Account.Manage | ||
{ | ||
public class ChangePasswordModel : PageModel | ||
{ | ||
private readonly UserManager<IdentityUser> _userManager; | ||
private readonly SignInManager<IdentityUser> _signInManager; | ||
private readonly ILogger<ChangePasswordModel> _logger; | ||
|
||
public ChangePasswordModel( | ||
UserManager<IdentityUser> userManager, | ||
SignInManager<IdentityUser> signInManager, | ||
ILogger<ChangePasswordModel> logger) | ||
{ | ||
_userManager = userManager; | ||
_signInManager = signInManager; | ||
_logger = logger; | ||
} | ||
|
||
/// <summary> | ||
/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used | ||
/// directly from your code. This API may change or be removed in future releases. | ||
/// </summary> | ||
[BindProperty] | ||
public InputModel Input { get; set; } | ||
|
||
/// <summary> | ||
/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used | ||
/// directly from your code. This API may change or be removed in future releases. | ||
/// </summary> | ||
[TempData] | ||
public string StatusMessage { get; set; } | ||
|
||
/// <summary> | ||
/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used | ||
/// directly from your code. This API may change or be removed in future releases. | ||
/// </summary> | ||
public class InputModel | ||
{ | ||
/// <summary> | ||
/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used | ||
/// directly from your code. This API may change or be removed in future releases. | ||
/// </summary> | ||
[Required] | ||
[DataType(DataType.Password)] | ||
[Display(Name = "Current password")] | ||
public string OldPassword { get; set; } | ||
|
||
/// <summary> | ||
/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used | ||
/// directly from your code. This API may change or be removed in future releases. | ||
/// </summary> | ||
[Required] | ||
[StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] | ||
[DataType(DataType.Password)] | ||
[Display(Name = "New password")] | ||
public string NewPassword { get; set; } | ||
|
||
/// <summary> | ||
/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used | ||
/// directly from your code. This API may change or be removed in future releases. | ||
/// </summary> | ||
[DataType(DataType.Password)] | ||
[Display(Name = "Confirm new password")] | ||
[Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] | ||
public string ConfirmPassword { get; set; } | ||
} | ||
|
||
public async Task<IActionResult> OnGetAsync() | ||
{ | ||
var user = await _userManager.GetUserAsync(User); | ||
if (user == null) | ||
{ | ||
return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); | ||
} | ||
|
||
var hasPassword = await _userManager.HasPasswordAsync(user); | ||
if (!hasPassword) | ||
{ | ||
return RedirectToPage("./SetPassword"); | ||
} | ||
|
||
return Page(); | ||
} | ||
|
||
public async Task<IActionResult> OnPostAsync() | ||
{ | ||
if (!ModelState.IsValid) | ||
{ | ||
return Page(); | ||
} | ||
|
||
var user = await _userManager.GetUserAsync(User); | ||
if (user == null) | ||
{ | ||
return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); | ||
} | ||
|
||
var changePasswordResult = await _userManager.ChangePasswordAsync(user, Input.OldPassword, Input.NewPassword); | ||
if (!changePasswordResult.Succeeded) | ||
{ | ||
foreach (var error in changePasswordResult.Errors) | ||
{ | ||
ModelState.AddModelError(string.Empty, error.Description); | ||
} | ||
return Page(); | ||
} | ||
|
||
await _signInManager.RefreshSignInAsync(user); | ||
_logger.LogInformation("User changed their password successfully."); | ||
StatusMessage = "Your password has been changed."; | ||
|
||
return RedirectToPage(); | ||
} | ||
} | ||
} |
33 changes: 33 additions & 0 deletions
33
Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
@page | ||
@model DeletePersonalDataModel | ||
@{ | ||
ViewData["Title"] = "Delete Personal Data"; | ||
ViewData["ActivePage"] = ManageNavPages.PersonalData; | ||
} | ||
|
||
<h3>@ViewData["Title"]</h3> | ||
|
||
<div class="alert alert-warning" role="alert"> | ||
<p> | ||
<strong>Deleting this data will permanently remove your account, and this cannot be recovered.</strong> | ||
</p> | ||
</div> | ||
|
||
<div> | ||
<form id="delete-user" method="post"> | ||
<div asp-validation-summary="ModelOnly" class="text-danger" role="alert"></div> | ||
@if (Model.RequirePassword) | ||
{ | ||
<div class="form-floating mb-3"> | ||
<input asp-for="Input.Password" class="form-control" autocomplete="current-password" aria-required="true" placeholder="Please enter your password." /> | ||
<label asp-for="Input.Password" class="form-label"></label> | ||
<span asp-validation-for="Input.Password" class="text-danger"></span> | ||
</div> | ||
} | ||
<button class="w-100 btn btn-lg btn-danger" type="submit">Delete data and close my account</button> | ||
</form> | ||
</div> | ||
|
||
@section Scripts { | ||
<partial name="_ValidationScriptsPartial" /> | ||
} |
103 changes: 103 additions & 0 deletions
103
Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
// Licensed to the .NET Foundation under one or more agreements. | ||
// The .NET Foundation licenses this file to you under the MIT license. | ||
#nullable disable | ||
|
||
using System; | ||
using System.ComponentModel.DataAnnotations; | ||
using System.Threading.Tasks; | ||
using Microsoft.AspNetCore.Identity; | ||
using Microsoft.AspNetCore.Mvc; | ||
using Microsoft.AspNetCore.Mvc.RazorPages; | ||
using Microsoft.Extensions.Logging; | ||
|
||
namespace SelenicSparkApp.Areas.Identity.Pages.Account.Manage | ||
{ | ||
public class DeletePersonalDataModel : PageModel | ||
{ | ||
private readonly UserManager<IdentityUser> _userManager; | ||
private readonly SignInManager<IdentityUser> _signInManager; | ||
private readonly ILogger<DeletePersonalDataModel> _logger; | ||
|
||
public DeletePersonalDataModel( | ||
UserManager<IdentityUser> userManager, | ||
SignInManager<IdentityUser> signInManager, | ||
ILogger<DeletePersonalDataModel> logger) | ||
{ | ||
_userManager = userManager; | ||
_signInManager = signInManager; | ||
_logger = logger; | ||
} | ||
|
||
/// <summary> | ||
/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used | ||
/// directly from your code. This API may change or be removed in future releases. | ||
/// </summary> | ||
[BindProperty] | ||
public InputModel Input { get; set; } | ||
|
||
/// <summary> | ||
/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used | ||
/// directly from your code. This API may change or be removed in future releases. | ||
/// </summary> | ||
public class InputModel | ||
{ | ||
/// <summary> | ||
/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used | ||
/// directly from your code. This API may change or be removed in future releases. | ||
/// </summary> | ||
[Required] | ||
[DataType(DataType.Password)] | ||
public string Password { get; set; } | ||
} | ||
|
||
/// <summary> | ||
/// This API supports the ASP.NET Core Identity default UI infrastructure and is not intended to be used | ||
/// directly from your code. This API may change or be removed in future releases. | ||
/// </summary> | ||
public bool RequirePassword { get; set; } | ||
|
||
public async Task<IActionResult> OnGet() | ||
{ | ||
var user = await _userManager.GetUserAsync(User); | ||
if (user == null) | ||
{ | ||
return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); | ||
} | ||
|
||
RequirePassword = await _userManager.HasPasswordAsync(user); | ||
return Page(); | ||
} | ||
|
||
public async Task<IActionResult> OnPostAsync() | ||
{ | ||
var user = await _userManager.GetUserAsync(User); | ||
if (user == null) | ||
{ | ||
return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); | ||
} | ||
|
||
RequirePassword = await _userManager.HasPasswordAsync(user); | ||
if (RequirePassword) | ||
{ | ||
if (!await _userManager.CheckPasswordAsync(user, Input.Password)) | ||
{ | ||
ModelState.AddModelError(string.Empty, "Incorrect password."); | ||
return Page(); | ||
} | ||
} | ||
|
||
var result = await _userManager.DeleteAsync(user); | ||
var userId = await _userManager.GetUserIdAsync(user); | ||
if (!result.Succeeded) | ||
{ | ||
throw new InvalidOperationException($"Unexpected error occurred deleting user."); | ||
} | ||
|
||
await _signInManager.SignOutAsync(); | ||
|
||
_logger.LogInformation("User with ID '{UserId}' deleted themselves.", userId); | ||
|
||
return Redirect("~/"); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
@page | ||
@model Disable2faModel | ||
@{ | ||
ViewData["Title"] = "Disable two-factor authentication (2FA)"; | ||
ViewData["ActivePage"] = ManageNavPages.TwoFactorAuthentication; | ||
} | ||
|
||
<partial name="_StatusMessage" for="StatusMessage" /> | ||
<h3>@ViewData["Title"]</h3> | ||
|
||
<div class="alert alert-warning" role="alert"> | ||
<p> | ||
<strong>This action only disables 2FA.</strong> | ||
</p> | ||
<p> | ||
Disabling 2FA does not change the keys used in authenticator apps. If you wish to change the key | ||
used in an authenticator app you should <a asp-page="./ResetAuthenticator">reset your authenticator keys.</a> | ||
</p> | ||
</div> | ||
|
||
<div> | ||
<form method="post"> | ||
<button class="btn btn-danger" type="submit">Disable 2FA</button> | ||
</form> | ||
</div> |
Oops, something went wrong.