2017-04-15 4 views
0

私は自分のasp.netのコアプロジェクトのいずれかのFacebookのログインを使用しています。しかし、突然Facebookのログインのために働いていませんでした。 HTTP 500エラーが表示されます。asp.netのコアでFacebookのログインが動作していないと返す500

問題は、さらに多くのデバッグでも、asp.netコアはエラーを言及していません。同じ500のエラーコードです。他に何もない。

public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null)の最初の行にブレークポイントを設定しようとしたとき、私はブレークポイントを打つことさえしていないことに気がつきました。

これをさらにデバッグする方法がわかりません。ここに何もないのですか?または、ログイン側でFBから変更がありますか?

打撃を受けて戻りURLが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

あなただけ=がstate_tokenある

この状態をからかって... asp.netコアRC3リリースにアップグレードする必要があります。あなたが投稿した返信URLを参照してください。

してください、

は、この情報がお役に立てば幸いです...

HTTP 500エラーがあなたのウェブサイトのサーバーに問題があることを示唆して認証ミドルウェアの構成に関するConfigureServicesメソッドからコードを投稿...

0

@skjoshi、あなたはExternalLoginCallbackメソッドが正常で、エラーの原因はそこにはありません。あなたが投稿したリターンURLの形式であることを

注:あなたは、あなたの質問にpopsted URLテキストを注意深く見ている場合 https://localhost:44300/signin-facebook?code=AUTH_CODE&state=STATE_TOKEN

は、あなたがコードと状態の両方に気付くでしょう。このURLはFacebookを表しています あなたのASP.NETアプリケーションへの最初のリダイレクトは、Facebookにリクエストを送信して、AUTH_CODE とアクセストークンを交換します...アプリケーションサーバーとFacebookサーバー間の通信のどこか したがって、ExternalLoginCallbackは決してヒットしません。

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

時間をとっていただきありがとうございます。これらのオプションで 'UseFacebookAuthentication'を設定しました。 – skjoshi

関連する問題