ASP.NET core 2, как пропустить форму ассоциации идентичности? - PullRequest
0 голосов
/ 25 апреля 2019

У меня простое приложение ASP.NET, и я пытаюсь разрешить пользователям входить в систему с использованием внешних поставщиков аутентификации.Пока что мне удалось внедрить google auth, однако после входа в систему пользователю необходимо подтвердить адрес электронной почты.Я хотел бы пропустить этот шаг.

Я пытался использовать config с

 services.AddIdentity<ApplicationUser, IdentityRole>(config =>
                    {
                        config.SignIn.RequireConfirmedEmail = false;
                    })
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();

, но без удачи.Также я попытался изменить ExternalLoginCallback и ExternalLoginConfirmation, но я все время путаю его еще больше.

Может ли кто-нибудь быть таким любезным и поделиться реальным кодом, который я должен использовать, чтобы создать нового пользователя без необходимостиподтверждение его электронной почты?

1 Ответ

1 голос
/ 29 апреля 2019

Чтобы пропустить процесс сопоставления электронной почты, вы можете изменить 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 });
}

. При этом будет пропущена связанная форма и автоматически используется имя электронной почты внешнего пользователя.

...