मैं Google प्रमाणीकरण लॉगिन के साथ वेब एप्लिकेशन विकसित करने के लिए एएसपीनेट कोर का उपयोग कर रहा हूं

मैं Google क्रेडेंशियल प्राप्त करने और उपयोगकर्ता को सबसे पहले पंजीकृत करने का प्रबंधन करने में सफल रहा। लेकिन समस्या यह है कि Google क्रेडेंशियल के साथ एप्लिकेशन में उपयोगकर्ता का पंजीकरण भी होता है, यह हमेशा आवेदन के लिए बार-बार पंजीकरण करने के लिए कहता है।

मैंने पाया कि यह बाहरी लॉग इन साइनइनएसिंक फ़ंक्शन कॉलिंग के कारण होता है और यह हमेशा इसके लिए झूठा देता है, मैंने इन पैरामीटरों को बदल दिया और कई बार कोशिश की isPersistent:false/true) और बाईपासTwoFactor: true/false मेरे पास सभी विविधताओं के ऊपर परीक्षण है। लेकिन यह हमेशा परिणाम के लिए झूठा देता है। साथ ही मैंने सामान्य रूप से पंजीकृत उपयोगकर्ता लॉगिन के साथ Google प्रमाणीकरण के साथ प्रयास किया। इसने मुझे भी वही परिणाम दिया

   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 प्रमाणीकरण के साथ नहीं

0
Dulith chinthaka 4 अक्टूबर 2019, 08:01

2 जवाब

सबसे बढ़िया उत्तर

मुझे अंततः गलती मिली, यह ईमेल पुष्टिकरण चीज़ के कारण हुआ, मेरे स्टार्टअप.सीएस वर्ग में मैंने जोड़ा है

 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 प्रमाणीकरण का भी उपयोग करते हैं। इसे ठीक करने के लिए मैंने जो किया है वह यह था कि जब मैं Google प्रमाणीकरण लॉगिन का उपयोग करके नया उपयोगकर्ता बनाता हूं तो मैंने उपयोगकर्ता पैरामीटर सेट किए हैं जिसमें ईमेल पुष्टिकरण = उपयोगकर्ता नाम के लिए सही जोड़ और उपयोगकर्ता ईमेल। तब उस बग को ठीक कर दिया गया था। उसके बाद जब मैं नीचे दिए गए फ़ंक्शन को कॉल करता हूं:

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
Dulith chinthaka 7 अक्टूबर 2019, 08:26

जब GetExternalLoginInfoAsync झूठी वापसी करता है तो आप जांच सकते हैं कि उपयोगकर्ता मौजूद है, यदि उपयोगकर्ता मौजूद है तो लॉगिन जोड़ें।

अन्यथा, उपयोगकर्ता के पास खाता नहीं है, फिर उपयोगकर्ता को खाता बनाने के लिए कहता है।

    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 });
    }
1
Gökten Karadağ 4 अक्टूबर 2019, 09:23
बहुत बहुत धन्यवाद गोकटेन कराडाğ मैं इसे आजमाउंगा
 – 
Dulith chinthaka
4 अक्टूबर 2019, 09:27