Always send confirmation email from social registration (#18150)

This commit is contained in:
Hao Kung 2020-01-09 11:52:58 -08:00 committed by GitHub
parent f8da3e2e33
commit da984f57c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 19 deletions

View File

@ -197,13 +197,6 @@ namespace Microsoft.AspNetCore.Identity.UI.V3.Pages.Account.Internal
{ {
_logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider); _logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider);
// If account confirmation is required, we need to show the link if we don't have a real email sender
if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
return RedirectToPage("./RegisterConfirmation", new { Email = Input.Email });
}
await _signInManager.SignInAsync(user, isPersistent: false);
var userId = await _userManager.GetUserIdAsync(user); var userId = await _userManager.GetUserIdAsync(user);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
@ -215,6 +208,14 @@ namespace Microsoft.AspNetCore.Identity.UI.V3.Pages.Account.Internal
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email", await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>."); $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
// If account confirmation is required, we need to show the link if we don't have a real email sender
if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
return RedirectToPage("./RegisterConfirmation", new { Email = Input.Email });
}
await _signInManager.SignInAsync(user, isPersistent: false);
return LocalRedirect(returnUrl); return LocalRedirect(returnUrl);
} }

View File

@ -116,10 +116,7 @@ namespace Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal
_emailSender = emailSender; _emailSender = emailSender;
} }
public override IActionResult OnGet() public override IActionResult OnGet() => RedirectToPage("./Login");
{
return RedirectToPage("./Login");
}
public override IActionResult OnPost(string provider, string returnUrl = null) public override IActionResult OnPost(string provider, string returnUrl = null)
{ {
@ -197,13 +194,6 @@ namespace Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal
{ {
_logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider); _logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider);
// If account confirmation is required, we need to show the link if we don't have a real email sender
if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
return RedirectToPage("./RegisterConfirmation", new { Email = Input.Email });
}
await _signInManager.SignInAsync(user, isPersistent: false);
var userId = await _userManager.GetUserIdAsync(user); var userId = await _userManager.GetUserIdAsync(user);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
@ -216,6 +206,13 @@ namespace Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email", await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>."); $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
// If account confirmation is required, we need to show the link if we don't have a real email sender
if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
return RedirectToPage("./RegisterConfirmation", new { Email = Input.Email });
}
await _signInManager.SignInAsync(user, isPersistent: false);
return LocalRedirect(returnUrl); return LocalRedirect(returnUrl);
} }
} }

View File

@ -3,6 +3,7 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Identity.DefaultUI.WebSite;
using Microsoft.AspNetCore.Identity.UI.Services; using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -155,9 +156,10 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
public async Task CanRegisterWithASocialLoginProviderFromLoginWithConfirmationAndRealEmailSender() public async Task CanRegisterWithASocialLoginProviderFromLoginWithConfirmationAndRealEmailSender()
{ {
// Arrange // Arrange
var emailSender = new ContosoEmailSender();
void ConfigureTestServices(IServiceCollection services) void ConfigureTestServices(IServiceCollection services)
{ {
services.AddSingleton<IEmailSender, FakeEmailSender>(); services.SetupTestEmailSender(emailSender);
services services
.Configure<IdentityOptions>(o => o.SignIn.RequireConfirmedAccount = true) .Configure<IdentityOptions>(o => o.SignIn.RequireConfirmedAccount = true)
.SetupTestThirdPartyLogin(); .SetupTestThirdPartyLogin();
@ -173,6 +175,7 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
// Act & Assert // Act & Assert
await UserStories.RegisterNewUserWithSocialLoginWithConfirmationAsync(client, userName, email, hasRealEmailSender: true); await UserStories.RegisterNewUserWithSocialLoginWithConfirmationAsync(client, userName, email, hasRealEmailSender: true);
Assert.Single(emailSender.SentEmails);
} }
[Fact] [Fact]