ASP.NET MVC5 OWIN L’autenticazione di Facebook improvvisamente non funziona

Aggiornamento 2017!

Il problema che ho avuto quando ho postato la domanda originale non ha nulla a che fare con le recenti modifiche apportate da Facebook quando hanno costretto tutti alla versione 2.3 della loro API. Per una soluzione a questo problema specifico, vedere la risposta di sammy34 di seguito . La versione 2.3 dell’endpoint / oauth / access_token restituisce ora JSON anziché i valori codificati in forma

Per motivi storici, ecco la mia domanda / problema originale:

Ho un’applicazione MVC5 Web che utilizza il supporto integrato per l’autenticazione tramite Facebook e Google. Quando abbiamo creato questa app alcuni mesi fa, abbiamo seguito questo tutorial: http://www.asp.net/mvc/tutorials/mvc-5/create-an-aspnet-mvc-5-app-with-facebook-and -google-oauth2-and-openid-sign-on e tutto ha funzionato alla grande.

Ora, all’improvviso, l’autenticazione di Facebook ha smesso di funzionare completamente. L’autenticazione di Google funziona ancora alla grande.

Descrizione del problema: Clicchiamo sul collegamento per connettersi tramite Facebook, siamo reindirizzati su Facebook dove viene richiesto se non vogliamo consentire alla nostra app di Facebook di accedere al nostro profilo. Quando clicchiamo su “OK”, verremo reindirizzati al nostro sito, ma invece di essere loggati semplicemente finiremo nella schermata di accesso.

Ho eseguito questo processo in modalità di debug e ho ottenuto questo ActionResult nel mio account controller come da tutorial sopra menzionato:

// GET: /Account/ExternalLoginCallback [AllowAnonymous] public async Task ExternalLoginCallback(string returnUrl) { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return RedirectToAction("Login"); } ............ 

Quando si passa attraverso il codice e al ritorno da Facebook, l’object loginInfo è sempre NULL, il che comporta il reindirizzamento dell’utente al login.

Per capire cosa sta realmente accadendo dietro le quinte, ho installato Fiddler e monitorato il traffico HTTP. Quello che ho scoperto è che cliccando su “OK” nella finestra di dialogo di authorization di Facebook, Facebook reindirizza alla nostra applicazione con questo URL:

 https://localhost/signin-facebook?code= 

Questo URL non è un file reale e probabilmente gestito da qualche controller / gestore incorporato in questo framework OWIN, suppongo. Molto probabilmente, si sta riconnettendo a Facebook usando il codice dato per interrogare le informazioni sull’utente che sta tentando di accedere. Ora, il problema è che invece di farlo, siamo reindirizzati a:

 /Account/ExternalLoginCallback?error=access_denied 

Quale sono sicuro è qualcosa che Facebook sta facendo, cioè, invece di darci i dati dell’utente, ci sta reindirizzando con questo messaggio di errore.

Questo fa sì che AuthenticationManager.GetExternalLoginInfoAsync(); fallire e restituire sempre NULL.

Sono completamente fuori di idee. Per quanto ne sappiamo, non abbiamo cambiato nulla da noi.

Ho provato a creare una nuova app di Facebook, ho provato a seguire di nuovo il tutorial ma ho sempre lo stesso problema.

Qualche idea benvenuta!

Aggiornare!

OK, questo mi sta facendo impazzire! Ora ho eseguito manualmente i passaggi necessari per eseguire l’autenticazione e tutto funziona alla grande quando lo faccio. Perché sulla terra non funziona questo quando si usa la roba di MVC5 Owin?

Questo è quello che ho fatto:

  // Step 1 - Pasted this into a browser, this returns a code https://www.facebook.com/dialog/oauth?response_type=code&client_id=619359858118523&redirect_uri=https%3A%2F%2Flocalhost%2Fsignin-facebook&scope=&state=u9R1m4iRI6Td4yACEgO99ETQw9NAos06bZWilJxJrXRn1rh4KEQhfuEVAq52UPnUif-lEHgayyWrsrdlW6t3ghLD8iFGX5S2iUBHotyTqCCQ9lx2Nl091pHPIw1N0JV23sc4wYfOs2YU5smyw9MGhcEuinvTAEql2QhBowR62FfU6PY4lA6m8pD3odI5MwBYOMor3eMLu2qnpEk0GekbtTVWgQnKnH6t1UcC6KcNXYY I was redirected back to localhost (which I had shut down at this point to avoid being redirected immediately away). The URL I was redirected to is this: https://localhost/signin-facebook?code= Now, I grabbed the code I got and used it in the URL below: // Step 2 - opened this URL in a browser, and successfully retrieved an access token https://graph.facebook.com/oauth/access_token?client_id=619359858118523&redirect_uri=https://localhost/signin-facebook&client_secret=&code= // Step 3 - Now I'm able to query the facebook graph using the access token from step 2! https://graph.facebook.com/me?access_token= 

Nessun errore, tutto funziona alla grande! Allora perché diavolo non funziona quando usi la roba di MVC5 Owin? Ovviamente c’è qualcosa di sbagliato nell’implementazione di OWin.