diff --git a/Streetwriters.Identity/Controllers/AccountController.cs b/Streetwriters.Identity/Controllers/AccountController.cs index 69d2f5a..f630821 100644 --- a/Streetwriters.Identity/Controllers/AccountController.cs +++ b/Streetwriters.Identity/Controllers/AccountController.cs @@ -116,7 +116,7 @@ namespace Streetwriters.Identity.Controllers } [HttpPost("verify")] - public async Task SendVerificationEmail() + public async Task SendVerificationEmail([FromForm] string newEmail) { var client = Clients.FindClientById(User.FindFirstValue("client_id")); if (client == null) return BadRequest("Invalid client_id."); @@ -124,9 +124,17 @@ namespace Streetwriters.Identity.Controllers var user = await UserManager.GetUserAsync(User); if (!await IsUserValidAsync(user, client.Id)) return BadRequest($"Unable to find user with ID '{UserManager.GetUserId(User)}'."); - var code = await UserManager.GenerateEmailConfirmationTokenAsync(user); - var callbackUrl = Url.TokenLink(user.Id.ToString(), code, client.Id, TokenType.CONFRIM_EMAIL, Request.Scheme); - await EmailSender.SendConfirmationEmailAsync(user.Email, callbackUrl, client); + if (string.IsNullOrEmpty(newEmail)) + { + var code = await UserManager.GenerateEmailConfirmationTokenAsync(user); + var callbackUrl = Url.TokenLink(user.Id.ToString(), code, client.Id, TokenType.CONFRIM_EMAIL, Request.Scheme); + await EmailSender.SendConfirmationEmailAsync(user.Email, callbackUrl, client); + } + else + { + var code = await UserManager.GenerateChangeEmailTokenAsync(user, newEmail); + await EmailSender.SendChangeEmailConfirmationAsync(newEmail, code, client); + } return Ok(); } @@ -145,6 +153,9 @@ namespace Streetwriters.Identity.Controllers } await UserManager.RemoveFromRoleAsync(user, client.Id); + + IdentityUserClaim statusClaim = user.Claims.FirstOrDefault((c) => c.ClaimType == $"{client.Id}:status"); + await UserManager.RemoveClaimAsync(user, statusClaim.ToClaim()); return Ok(); } @@ -256,11 +267,22 @@ namespace Streetwriters.Identity.Controllers { case "change_email": { - var code = await UserManager.GenerateChangeEmailTokenAsync(user, form.NewEmail); - // var callbackUrl = Url.TokenLink(user.Id.ToString(), code, client.Id, TokenType.CHANGE_EMAIL, Request.Scheme); - await EmailSender.SendChangeEmailConfirmationAsync(user.Email, code, client); - await UserManager.AddClaimAsync(user, new Claim("new_email", form.NewEmail)); - return Ok(); + var result = await UserManager.ChangeEmailAsync(user, form.NewEmail, form.VerificationCode); + if (result.Succeeded) + { + result = await UserManager.RemovePasswordAsync(user); + if (result.Succeeded) + { + result = await UserManager.AddPasswordAsync(user, form.Password); + if (result.Succeeded) + { + await UserManager.SetUserNameAsync(user, form.NewEmail); + await SendEmailChangedMessageAsync(user.Id.ToString()); + return Ok(); + } + } + } + return BadRequest(result.Errors.ToErrors()); } case "change_password": { @@ -327,6 +349,19 @@ namespace Streetwriters.Identity.Controllers }); } + private async Task SendEmailChangedMessageAsync(string userId) + { + await WampServers.MessengerServer.PublishMessageAsync(WampServers.MessengerServer.Topics.SendSSETopic, new SendSSEMessage + { + UserId = userId, + OriginTokenId = User.FindFirstValue("jti"), + Message = new Message + { + Type = "userEmailChanged" + } + }); + } + public async Task IsUserValidAsync(User user, string clientId) { return user != null && await UserManager.IsInRoleAsync(user, clientId); diff --git a/Streetwriters.Identity/Models/UpdateUserForm.cs b/Streetwriters.Identity/Models/UpdateUserForm.cs index 0822601..8bfa2f6 100644 --- a/Streetwriters.Identity/Models/UpdateUserForm.cs +++ b/Streetwriters.Identity/Models/UpdateUserForm.cs @@ -44,10 +44,24 @@ namespace Streetwriters.Identity.Models get; set; } + + [BindProperty(Name = "password")] + public string Password + { + get; set; + } + [BindProperty(Name = "new_email")] public string NewEmail { get; set; } + + + [BindProperty(Name = "verification_code")] + public string VerificationCode + { + get; set; + } } } \ No newline at end of file diff --git a/Streetwriters.Identity/Services/EmailSender.cs b/Streetwriters.Identity/Services/EmailSender.cs index 10dceed..7b551a2 100644 --- a/Streetwriters.Identity/Services/EmailSender.cs +++ b/Streetwriters.Identity/Services/EmailSender.cs @@ -124,7 +124,7 @@ namespace Streetwriters.Identity.Services await SendEmailAsync(email, template, client); } - public async Task SendChangeEmailConfirmationAsync(string email, string callbackUrl, IClient client) + public async Task SendChangeEmailConfirmationAsync(string email, string code, IClient client) { var template = new EmailTemplate { @@ -134,7 +134,7 @@ namespace Streetwriters.Identity.Services Data = new { app_name = client.Name, - confirm_link = callbackUrl + code = code } }; await SendEmailAsync(email, template, client); diff --git a/Streetwriters.Identity/Startup.cs b/Streetwriters.Identity/Startup.cs index 5ec12a4..d6272d5 100644 --- a/Streetwriters.Identity/Startup.cs +++ b/Streetwriters.Identity/Startup.cs @@ -86,6 +86,8 @@ namespace Streetwriters.Identity // User settings. //options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._"; options.User.RequireUniqueEmail = true; + + options.Tokens.ChangeEmailTokenProvider = TokenOptions.DefaultPhoneProvider; }, (options) => { options.RolesCollection = "roles"; diff --git a/Streetwriters.Identity/Templates/EmailChangeConfirmation.html b/Streetwriters.Identity/Templates/EmailChangeConfirmation.html index 94b0c5f..f56a796 100644 --- a/Streetwriters.Identity/Templates/EmailChangeConfirmation.html +++ b/Streetwriters.Identity/Templates/EmailChangeConfirmation.html @@ -227,10 +227,7 @@ > -

- Confirm your new email to change it for - your {{app_name}} account. -

+

@@ -243,14 +240,14 @@ cellspacing="0" width="100%" style="table-layout: fixed" - data-muid="14957e19-e5cc-41de-b9a5-4ee51daed01f" + data-muid="ee9d04d5-2dd9-446e-8f33-04b3a587d059" data-mc-module-version="2019-10-22" > @@ -301,26 +298,9 @@ text-align: inherit; " > - Hey there! - -
-
-
-
- Please confirm your new email by - clicking - here - or the button below. + Please use the following + verification code to change to your + account email:
@@ -329,71 +309,122 @@ + + +
- - - - - - -
- Confirm Email -
+
+
+ {{code}} +
+
+
+
+ + + + @@ -407,7 +438,7 @@ cellspacing="0" width="100%" style="table-layout: fixed" - data-muid="aca25e2b-4cbf-43ae-b606-419fa0702f66" + data-muid="ca9de43c-4050-4410-8963-d49989152c4c" > @@ -452,7 +483,7 @@ cellspacing="0" width="100%" style="table-layout: fixed" - data-muid="5e37834f-be09-4696-a807-ae46f2725837" + data-muid="3d5612f4-e335-4774-9238-fbe38b2d85ed" data-mc-module-version="2019-10-22" > @@ -477,99 +508,26 @@ > This email has been sent to you because you signed up on {{app_name}}{{app_name}} - a service of Streetwriters + - a service by Streetwriters (Private) Ltd. @@ -581,61 +539,8 @@ > 1st Floor, Valley Plaza, Mardowal Chowk, NausheraKhushab, - Punjab - 41100 PakistanKhushab, Punjab 41100 + Pakistan
diff --git a/Streetwriters.Identity/Templates/EmailChangeConfirmation.txt b/Streetwriters.Identity/Templates/EmailChangeConfirmation.txt index 5e1d3d8..ee6f44c 100644 --- a/Streetwriters.Identity/Templates/EmailChangeConfirmation.txt +++ b/Streetwriters.Identity/Templates/EmailChangeConfirmation.txt @@ -4,9 +4,11 @@ Confirm your new email to change it for your {{app_name}} account. {{app_name}} ************ -Hey there! +Please use the following verification code to change to your account email: -Please confirm your new email by going to this link: {{confirm_link}} +{{code}} + +If you did not request a verification code, please report this to us at support@streetwriters.co ------------
+
+
+ If you did not request to a + verification code, please report + this to us at + support@streetwriters.co +
+
+