2017-04-15 63 views
0

我一直在使用Facebook登录为我的asp.net核心项目之一。但是,它突然停止为Facebook登录工作。我收到HTTP 500错误。Facebook登录在asp.net核心不工作,并返回500

的问题是,即使是在调试多,asp.net芯不提任何错误。它只是相同的500错误代码。没有其他的。

当我试图在第一行public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null)函数中设置断点时,我意识到它甚至在此之前甚至没有触及那个并且失败。

我不知道如何进一步调试。我在这里错过了什么吗?或者登录方的FB有任何改变吗?

被打的返回网址是Facebook是:

https://localhost:44300/signin-facebook?code=AQBxGGw7ZCoa9xtXc3CCsVGRD9TJLL428bZ_eJpUu4CtVu3K4UrfOZuYYdwFBXzGZ6GOGXpOi2Nme_jfbewB84otVZhKZfs4i7Dhi9Y3E_rloU9ouLeIvuOsm29jr7IDCtTj_HM7rKuKjj3zmc4yz5i_fniZ9ZhMfXtSus5KyKa4EFkZTsmKrz2ngMlGQalUAob_52GJNhvSIXDlmiNSrZLJV3m7Zbkf9eXETQkqhu2L1kgXPvWkMzVP8EN00GwRCYB3xT1kQMOimDANRKhziZjoVS5QZFUJTP0Faj47tE1xNfmAzb30iuwcaRORCOTMipUrnRvOO4nGRo8JuUNdPJaO&state=CfDJ8EHIO3qHMHFClr5BAt4EC1Wj7LyAs5Pg1XOqKo4uFiJM2Jr1rNyooxLIu2fbXr6Z3X5_kqbF_7WwFfvF3L3H4xgyooo-3Y9BV8Zh1S5wXlLJDAyCT5_LwkPJ1j8Zrwx4umQJp6NOl76GwRXpi1_BHlWGRxnh_naTL35iqeGovOa8oEDC0jOQ4trRe7YG3fV_ptjWk4yOnvJnsI81O-6wfyhdc3jm-LTP7ZO7-duf_lPZXZ8mL42XyLXDTIyOJ__S2yLYdvwItdDVntsM8Hwq94goXdU-RaH7ZkDA8iAzeCl3Ke0tWAdYBKy9vooJIXmE9Q#_=_

根据这篇文章,应该在URL中有state_token了。但这似乎在这里不见了。我怎样才能弄清楚什么是实际的错误?

我使用的是asp.net核心RC2版本。

我的回调函数是:

public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null) 
{ 
    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); 
    if (result.Succeeded) 
    { 
     _logger.LogInformation(5, "User logged in with {Name} provider.", info.LoginProvider); 
     return RedirectToLocal(returnUrl); 
    } 
    if (result.RequiresTwoFactor) 
    { 
     return RedirectToAction(nameof(SendCode), new { ReturnUrl = returnUrl }); 
    } 
    if (result.IsLockedOut) 
    { 
     return View("Lockout"); 
    } 
    else 
    { 
     // 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.ExternalPrincipal.FindFirstValue(ClaimTypes.Email); 

     if (email == null) 
     { 
      return View("Error"); 
     } 

     /* Determine user from external login info */ 
     var name = info.ExternalPrincipal.FindFirstValue(ClaimTypes.Name); 
     string firstName; 
     string lastName = ""; 
     if (!string.IsNullOrWhiteSpace(name)) 
     { 
      firstName = name.Split(' ').Length > 1? name.Split(new[] { ' ' }, 2)[0] : name; 
      lastName = name.Split(' ').Length > 1 ? name.Split(new[] { ' ' }, 2)[1] : ""; 
     } 
     else 
      firstName = email.Split('@')[0]; 

     var user = await _userManager.FindByEmailAsync(email); 
     if (user == null) 
     { 
      /* No user with same email ID. So, create a new user.*/ 
      var newUser = new ApplicationUser 
      { 
       UserName = email, 
       Email = email, 
       FirstName = firstName, 
       LastName = lastName, 
       PasswordLastModifiedTime = DateTime.UtcNow, 
       UserSignUpDate = DateTime.UtcNow 
      }; 

      var userCreationResult = await _userManager.CreateAsync(newUser); 
      if (userCreationResult.Succeeded) 
      { 
       userCreationResult = await _userManager.AddLoginAsync(newUser, info); 
       if (userCreationResult.Succeeded) 
       { 
        // Add user claims TODO:// Test if the claims are added successfully. 
        await _userManager.AddClaimAsync(newUser, new Claim("FirstName", newUser.FirstName)); 
        await _userManager.AddClaimAsync(newUser, new Claim("LastName", newUser.LastName)); 

        // Set user email to confirmed. This is more of work around 
        var code = await _userManager.GenerateEmailConfirmationTokenAsync(newUser); 
        userCreationResult = await _userManager.ConfirmEmailAsync(newUser, code); 
        if (userCreationResult.Succeeded) 
        { 
         //Create Subscription for user 
         var planService = new PlanServices(); 
         var plan = planService.Find((int)SubscriptionType.Basic); 

         await _subscriptionService.CreateSubscription(newUser, plan, null); 

         await _signInManager.SignInAsync(newUser, isPersistent: false); 
         _logger.LogInformation(6, "User created an account using {Name} provider.", 
          info.LoginProvider); 
         await _emailSender.SendWelcomeEmailAsync(newUser.Email, newUser.FirstName); 
         return RedirectToLocal(returnUrl); 
        } 
       } 
      } 
     } 
     else 
     { 
      /* A user with email ID exists. Associate the account with that.*/ 
      var loginAddResult = await _userManager.AddLoginAsync(user, info); 
      if (loginAddResult.Succeeded) 
      { 
       await _signInManager.SignInAsync(user, isPersistent: false); 
       return RedirectToLocal(returnUrl); 
      } 
     } 


     return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = email, FirstName = firstName, LastName = lastName}); 
    } 
} 

而且ConfigureServices方法是:

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddApplicationInsightsTelemetry(Configuration); 

    services.AddScoped<ApplicationDbContext>(); 

    services.AddIdentity<ApplicationUser, IdentityRole>(o => 
    { 
     o.Password.RequireDigit = false; 
     o.Password.RequireLowercase = false; 
     o.Password.RequireUppercase = false; 
     o.Password.RequireNonLetterOrDigit = false; 
     o.Password.RequiredLength = 8; 
    }) 
    .AddEntityFrameworkStores<ApplicationDbContext>() 
    .AddDefaultTokenProviders(); 


    services.AddCaching(); 

    services.AddSession(); 

    services.AddMvc(); 

    // Add application services. 
    services.AddTransient<IEmailSender, AuthMessageSender>(); 
    services.AddTransient<ISmsSender, AuthMessageSender>(); 
    services.AddTransient<ISubscriptionService, SubscriptionService>(); 
    services.Configure<AuthMessageSenderOptions>(Configuration); 
    services.Configure<RecaptchaOptions>(Configuration); 

    __serviceProvider = services.BuildServiceProvider(); 
} 

的事情是,它的工作以及很长一段时间,现在已经不再工作。此外,它甚至没有触及ExternalLoginCallback,所以我不知道该去哪里进一步调试。

+0

你可以添加“ExternalLoginCallback”里面写的示例代码? –

+0

你使用的是什么API版本?如果到目前为止,API v2.2已于3月底关闭,并且在API v2.3中,访问令牌返回的格式已更改。 – CBroe

+0

嗨看起来这可能是这里的问题。我如何检查它? – skjoshi

回答

0

你应该升级到asp.net核心RC3发布...开玩笑的

状态=是state_token。查看您发布的返回网址。

请从发布有关认证中间件

HTTP 500错误提示与您的网站的服务器有问题的配置ConfigureServices方法的代码...

希望这有助于...

0

@skjoshi,你ExternalLoginCallback方法是好的,错误的根源是不是在那里找到。

请注意,您已经发布的返回URL的形式是: https://localhost:44300/signin-facebook?code=AUTH_CODE&state=STATE_TOKEN

如果你在你的问题popsted URL文本仔细看,你会发现代码和状态。这个url表示Facebook的 初始重定向到回报发送给Facebook的请求与访问令牌在通信应用服务器和Facebook服务器之间交换AUTH_CODE ...某处ASP.NET应用程序 某事不对劲,和因此ExternalLoginCallback永远不会被击中。

你能在你的配置方法如下:

app.UseFacebookAuthentication(options => 
      { 
       options.AppId = Configuration["Authentication:Facebook:AppId"]; 
       options.AppSecret = Configuration["Authentication:Facebook:AppSecret"]; 
      }); 
+0

感谢您抽出时间。我用这些选项配置了UseFacebookAuthentication。 – skjoshi