Внешний вход с Google аутентификацией - PullRequest
0 голосов
/ 04 октября 2019

Я использую ядро ​​Asp.net для разработки веб-приложения с помощью Google Authentication Login

Мне удалось получить учетные данные Google и сначала зарегистрировать пользователя. Но проблема заключается даже в том, что пользователь регистрируется в приложении с помощью Google Credentials, он всегда запрашивает регистрацию снова и снова для приложения.

Я обнаружил, что это происходит из-за вызова функции ExternalLoginSignInAsync, и для этого всегда выдается false, я менял эти параметры и несколько раз пробовал isPersistent: false / true) и bypassTwoFactor: true / false У меня тест выше всех вариантов,Но это всегда дает ложный результат. Как и я пытался с Google Authentication с Нормально зарегистрированным пользователем, login.it также дал мне тот же результат

   public async Task<IActionResult> OnGetCallbackAsync(string returnUrl =null,string remoteError = null)
{
            returnUrl = returnUrl ?? Url.Content("~/");
            if (remoteError != null)
            {
                ErrorMessage = $"Error from external provider: 
                {remoteError}";
                return RedirectToPage("./Login", new {ReturnUrl = returnUrl });
            }
            var info = await _signInManager.GetExternalLoginInfoAsync();
            if (info == null)
            {
                ErrorMessage = "Error loading external login information.";
                return RedirectToPage("./Login", new { ReturnUrl = returnUrl });
            }
            var result = await 
               _signInManager.ExternalLoginSignInAsync(info.LoginProvider, 
               info.ProviderKey, isPersistent:false, bypassTwoFactor : true);

            if (result.Succeeded)
            {
                _logger.LogInformation("{Name} logged in with {LoginProvider} 
                provider.", info.Principal.Identity.Name, 
                info.LoginProvider);
                // return LocalRedirect(returnUrl);
                return LocalRedirect("/Customer/ProjectsApiKey/");
            }    

Не могли бы вы порадовать любого, кто уже решил эту проблему, помогитея ожидаю, что я должен сделать для проверки пользователя, уже зарегистрированного или не зарегистрированного в Google Authentication

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Я наконец нашел ошибку, это произошло из-за подтверждения электронной почты. В моем классе startup.cs я добавил

 config.SignIn.RequireConfirmedEmail = true;


public void ConfigureServices(IServiceCollection services)
{

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddDefaultIdentity<IdentityUser>(config =>
    {
        config.SignIn.RequireConfirmedEmail = true;
    })
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    // requires
    // using Microsoft.AspNetCore.Identity.UI.Services;
    // using WebPWrecover.Services;
    services.AddTransient<IEmailSender, EmailSender>();
    services.Configure<AuthMessageSenderOptions>(Configuration);

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

, поэтому всегда требуется подтверждать логин пользователя. даже если мы используем Google Authentication. Чтобы исправить это, я создал нового пользователя с помощью входа в систему Google Authentication. Я установил параметры пользователя, включая EmailConfirmation = true, добавление имени пользователя и электронной почты пользователя. Затем эта ошибка была исправлена. после этого, когда я вызываю ниже функцию

var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);

public async Task<IActionResult> OnPostConfirmationAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");
            // Get the information about the user from the external login provider
            var info = await _signInManager.GetExternalLoginInfoAsync();
            if (info == null)
            {
                ErrorMessage = "Error loading external login information during confirmation.";
                return RedirectToPage("./Login", new { ReturnUrl = returnUrl });
            }

            if (ModelState.IsValid)
            {
                // var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };   comment dulith
                var user = new ApplicationUser { UserName = Input.Email, Email = Input.Email ,EmailConfirmed=true};
                var result = await _userManager.CreateAsync(user);
                await _userManager.AddToRoleAsync(user, SD.User);
                if (result.Succeeded)
                {

                    result = await _userManager.AddLoginAsync(user, info);
                    if (result.Succeeded)
                    {
                        await _signInManager.SignInAsync(user, isPersistent: false);
                        _logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider);
                       // return LocalRedirect(returnUrl);
                        return LocalRedirect("/Customer/ProjectsApiKey/");
                    }
                }

Если пользователь существует

result.Succeeded is true

А также Большое спасибо за предыдущий ответ.

1 голос
/ 04 октября 2019

Когда GetExternalLoginInfoAsync возвращает false, вы можете проверить, существует ли пользователь, если пользователь существует, добавьте логин.

В противном случае пользователь не имеет учетной записи, а затем просит пользователя создать учетную запись.

    var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
    if (result.Succeeded)
    {
        return RedirectToAction("Index", "Home");
    }
    if (result.IsLockedOut)
    {
        return RedirectToAction(nameof(Lockout));
    }
    else
    {
        var user = await _userManager.FindByEmailAsync(email);
        if (user != null)
        {
            var resultTemp = await _userManager.AddLoginAsync(user, info);
            if (resultTemp.Succeeded)
            {
                await _signInManager.SignInAsync(user, isPersistent: true);
                return RedirectToAction("Index", "Home");
            }
        }
        // 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 });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...