ASP.NET核心2如何跳过身份关联表?
ASP.NET core 2 how to skip identity association form?
我有一个简单的 ASP.NET 应用程序,我正在尝试允许用户使用外部身份验证提供商登录。到目前为止,我已经设法实现了 google 身份验证,但是,登录后需要用户确认电子邮件。我想跳过这一步。
我试过使用
的配置
services.AddIdentity<ApplicationUser, IdentityRole>(config =>
{
config.SignIn.RequireConfirmedEmail = false;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
但没有运气。我也尝试修改 ExternalLoginCallback 和 ExternalLoginConfirmation 但是我总是把它搞得更糟。
任何人都可以分享我必须使用的实际代码,以便在不需要确认他的电子邮件的情况下创建新用户吗?
要跳过电子邮件关联过程,您可以将 ExternalLoginCallback
修改为:
[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
{
if (remoteError != null)
{
ErrorMessage = $"Error from external provider: {remoteError}";
return RedirectToAction(nameof(Login));
}
var info = await _signInManager.GetExternalLoginInfoAsync();
if (info == null)
{
return RedirectToAction(nameof(Login));
}
// Sign in the user with this external login provider if the user already has a login.
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
if (result.Succeeded)
{
_logger.LogInformation("User logged in with {Name} provider.", info.LoginProvider);
return RedirectToLocal(returnUrl);
}
if (result.IsLockedOut)
{
return RedirectToAction(nameof(Lockout));
}
else
{
var userEmail = info.Principal.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Email).Value.ToString();
var user = new ApplicationUser { UserName = userEmail, Email = userEmail };
var resultCreateUser = await _userManager.CreateAsync(user);
if (resultCreateUser.Succeeded)
{
var resultAddLogin = await _userManager.AddLoginAsync(user, info);
if (resultAddLogin.Succeeded)
{
await _signInManager.SignInAsync(user, isPersistent: false);
_logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider);
return RedirectToLocal(returnUrl);
}
}
}
// If the user does not have an account, then ask the user to create an account.
ViewData["ReturnUrl"] = returnUrl;
ViewData["LoginProvider"] = info.LoginProvider;
var email = info.Principal.FindFirstValue(ClaimTypes.Email);
return View("ExternalLogin", new ExternalLoginViewModel { Email = email });
}
这将跳过关联表单并自动使用外部用户的电子邮件名称。
我有一个简单的 ASP.NET 应用程序,我正在尝试允许用户使用外部身份验证提供商登录。到目前为止,我已经设法实现了 google 身份验证,但是,登录后需要用户确认电子邮件。我想跳过这一步。
我试过使用
的配置 services.AddIdentity<ApplicationUser, IdentityRole>(config =>
{
config.SignIn.RequireConfirmedEmail = false;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
但没有运气。我也尝试修改 ExternalLoginCallback 和 ExternalLoginConfirmation 但是我总是把它搞得更糟。
任何人都可以分享我必须使用的实际代码,以便在不需要确认他的电子邮件的情况下创建新用户吗?
要跳过电子邮件关联过程,您可以将 ExternalLoginCallback
修改为:
[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
{
if (remoteError != null)
{
ErrorMessage = $"Error from external provider: {remoteError}";
return RedirectToAction(nameof(Login));
}
var info = await _signInManager.GetExternalLoginInfoAsync();
if (info == null)
{
return RedirectToAction(nameof(Login));
}
// Sign in the user with this external login provider if the user already has a login.
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
if (result.Succeeded)
{
_logger.LogInformation("User logged in with {Name} provider.", info.LoginProvider);
return RedirectToLocal(returnUrl);
}
if (result.IsLockedOut)
{
return RedirectToAction(nameof(Lockout));
}
else
{
var userEmail = info.Principal.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Email).Value.ToString();
var user = new ApplicationUser { UserName = userEmail, Email = userEmail };
var resultCreateUser = await _userManager.CreateAsync(user);
if (resultCreateUser.Succeeded)
{
var resultAddLogin = await _userManager.AddLoginAsync(user, info);
if (resultAddLogin.Succeeded)
{
await _signInManager.SignInAsync(user, isPersistent: false);
_logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider);
return RedirectToLocal(returnUrl);
}
}
}
// If the user does not have an account, then ask the user to create an account.
ViewData["ReturnUrl"] = returnUrl;
ViewData["LoginProvider"] = info.LoginProvider;
var email = info.Principal.FindFirstValue(ClaimTypes.Email);
return View("ExternalLogin", new ExternalLoginViewModel { Email = email });
}
这将跳过关联表单并自动使用外部用户的电子邮件名称。