124 lines
4.8 KiB
Plaintext
124 lines
4.8 KiB
Plaintext
@page "/Account/Manage/Email"
|
|
|
|
@using System.ComponentModel.DataAnnotations
|
|
@using System.Text
|
|
@using System.Text.Encodings.Web
|
|
@using Microsoft.AspNetCore.Identity
|
|
@using Microsoft.AspNetCore.WebUtilities
|
|
@using adminSystem.UI.Data
|
|
|
|
@inject UserManager<ApplicationUser> UserManager
|
|
@inject IEmailSender<ApplicationUser> EmailSender
|
|
@inject IdentityUserAccessor UserAccessor
|
|
@inject NavigationManager NavigationManager
|
|
|
|
<PageTitle>Manage email</PageTitle>
|
|
|
|
<h3>Manage email</h3>
|
|
|
|
<StatusMessage Message="@message"/>
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<form @onsubmit="OnSendEmailVerificationAsync" @formname="send-verification" id="send-verification-form" method="post">
|
|
<AntiforgeryToken />
|
|
</form>
|
|
<EditForm Model="Input" FormName="change-email" OnValidSubmit="OnValidSubmitAsync" method="post">
|
|
<DataAnnotationsValidator />
|
|
<ValidationSummary class="text-danger" role="alert" />
|
|
@if (isEmailConfirmed)
|
|
{
|
|
<div class="form-floating mb-3 input-group">
|
|
<input type="text" value="@email" class="form-control" placeholder="Please enter your email." disabled />
|
|
<div class="input-group-append">
|
|
<span class="h-100 input-group-text text-success font-weight-bold">✓</span>
|
|
</div>
|
|
<label for="email" class="form-label">Email</label>
|
|
</div>
|
|
}
|
|
else
|
|
{
|
|
<div class="form-floating mb-3">
|
|
<input type="text" value="@email" class="form-control" placeholder="Please enter your email." disabled />
|
|
<label for="email" class="form-label">Email</label>
|
|
<button type="submit" class="btn btn-link" form="send-verification-form">Send verification email</button>
|
|
</div>
|
|
}
|
|
<div class="form-floating mb-3">
|
|
<InputText @bind-Value="Input.NewEmail" class="form-control" autocomplete="email" aria-required="true" placeholder="Please enter new email." />
|
|
<label for="new-email" class="form-label">New email</label>
|
|
<ValidationMessage For="() => Input.NewEmail" class="text-danger" />
|
|
</div>
|
|
<button type="submit" class="w-100 btn btn-lg btn-primary">Change email</button>
|
|
</EditForm>
|
|
</div>
|
|
</div>
|
|
|
|
@code {
|
|
private string? message;
|
|
private ApplicationUser user = default!;
|
|
private string? email;
|
|
private bool isEmailConfirmed;
|
|
|
|
[CascadingParameter]
|
|
private HttpContext HttpContext { get; set; } = default!;
|
|
|
|
[SupplyParameterFromForm(FormName = "change-email")]
|
|
private InputModel Input { get; set; } = new();
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
user = await UserAccessor.GetRequiredUserAsync(HttpContext);
|
|
email = await UserManager.GetEmailAsync(user);
|
|
isEmailConfirmed = await UserManager.IsEmailConfirmedAsync(user);
|
|
|
|
Input.NewEmail ??= email;
|
|
}
|
|
|
|
private async Task OnValidSubmitAsync()
|
|
{
|
|
if (Input.NewEmail is null || Input.NewEmail == email)
|
|
{
|
|
message = "Your email is unchanged.";
|
|
return;
|
|
}
|
|
|
|
var userId = await UserManager.GetUserIdAsync(user);
|
|
var code = await UserManager.GenerateChangeEmailTokenAsync(user, Input.NewEmail);
|
|
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
|
|
var callbackUrl = NavigationManager.GetUriWithQueryParameters(
|
|
NavigationManager.ToAbsoluteUri("Account/ConfirmEmailChange").AbsoluteUri,
|
|
new Dictionary<string, object?> { ["userId"] = userId, ["email"] = Input.NewEmail, ["code"] = code });
|
|
|
|
await EmailSender.SendConfirmationLinkAsync(user, Input.NewEmail, HtmlEncoder.Default.Encode(callbackUrl));
|
|
|
|
message = "Confirmation link to change email sent. Please check your email.";
|
|
}
|
|
|
|
private async Task OnSendEmailVerificationAsync()
|
|
{
|
|
if (email is null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var userId = await UserManager.GetUserIdAsync(user);
|
|
var code = await UserManager.GenerateEmailConfirmationTokenAsync(user);
|
|
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
|
|
var callbackUrl = NavigationManager.GetUriWithQueryParameters(
|
|
NavigationManager.ToAbsoluteUri("Account/ConfirmEmail").AbsoluteUri,
|
|
new Dictionary<string, object?> { ["userId"] = userId, ["code"] = code });
|
|
|
|
await EmailSender.SendConfirmationLinkAsync(user, email, HtmlEncoder.Default.Encode(callbackUrl));
|
|
|
|
message = "Verification email sent. Please check your email.";
|
|
}
|
|
|
|
private sealed class InputModel
|
|
{
|
|
[Required]
|
|
[EmailAddress]
|
|
[Display(Name = "New email")]
|
|
public string? NewEmail { get; set; }
|
|
}
|
|
}
|