GetExternalLoginInfoAsync di OWIN restituisce sempre null

Ho creato una nuova applicazione Web MVC5 e quando provo ad accedere con Google o Facebook, viene richiamata l’azione ExternalLoginCallback AccountController , ma GetExternalLoginInfoAsync() restituisce sempre null:

 var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return RedirectToAction("Login"); } 

Poiché è sempre nullo, si reindirizza nuovamente alla pagina di accesso e il processo ricomincia. Come posso risolvere questo?

Per ottenere il login OWIN di Google per funzionare correttamente su un Visual Studio 2013 standard, sito ASP.Net MVC5, ho dovuto:

  1. Imposta un account Google OpenId su https://console.developers.google.com/project

  2. Imposta l’URL di callback su blah/signin-google .
    Note importanti su cose che non devi fare:

    • Non è necessario utilizzare HTTPS per Google per redirect nuovamente; puoi persino redirect a http: // localhost , nessun problema.

    • Non è necessario impostare nulla per l’URL di reindirizzamento: nessuna route, azioni del controller o autorizzazioni speciali in Web.Config. L’URL di reindirizzamento è sempre / signin-google e OWIN gestisce questo dietro le quinte per te.

Ad esempio, se il tuo sito era me.com, potresti avere questi 3 URL di callback nella Google Developer Console:

 http://localhost:53859/signin-google http://test.me.com/signin-google https://me.com/signin-google 

Il primo include qualunque numero di porta VS ti abbia dato per il tuo progetto.

  1. Abilita l’API di Google+ . Questo è un b **** nascosto di un getcha ed è la causa principale del problema nella domanda qui – se non lo fai, è facile perdere che la Request to /account/ExternalLoginCallback include &error=access_denied , e questo perché Google ha risposto no a una richiesta di authorization creata da OWIN per il profilo di base di Google+ dell’utente. Non posso dire di chi sia la colpa, di Google o di Microsoft.

Per abilitare l’API di Google+ nella Developers Console, fai clic su API a sinistra, cerca su Google+, fai clic su di esso e seleziona Attiva. Sì, hai davvero bisogno di farlo. Se non lo fai, verrai protetto.

  1. Aggiungi ClientId e ClientSecret che Google ti ha fornito in Developers Console per l’avvio.Auth, ma migliora il codice nel processo per utilizzare esplicitamente OAuth2 e chiedere esplicitamente l’indirizzo email dell’utente:

     var google = new GoogleOAuth2AuthenticationOptions() { ClientId = "123abc.apps.googleusercontent.com", ClientSecret = "456xyz", Provider = new GoogleOAuth2AuthenticationProvider() }; google.Scope.Add("email"); app.UseGoogleAuthentication(google); 

Questo è tutto. Finalmente ha funzionato.

Voglio solo ripetere ancora una volta, ci sono MOLTE risposte su questo e problemi come quelli in cui OWIN / Google non funziona, e quasi tutti sono sbagliati per l’attuale modello VS2013 / MVC5 / OWIN.
Non è necessario modificare Web.Config.
Non è necessario creare alcun itinerario speciale di sorta.
Non dovresti cercare di indirizzare /signin-google in un posto diverso, o usare un URL di callback diverso, e sicuramente non dovresti tentare di legarlo direttamente a /account/externallogincallback o externalloginconfirmation , perché sono entrambi separati da /signin-google e i passaggi necessari nel processo OWIN / Google.

OK, ho scoperto perché è nulla. Devi abilitare Google + API nella console di Google. Assicurati inoltre che la chiave segreta non sia concatenata con uno spazio alla fine dopo averla incollata sul tuo codice. Perché non possono restituire un errore normale? Non lo so.

Sembra che il pacchetto Nuget Microsoft.Owin.Security.Facebook versione 3.0.1 non funzioni più con Facebook Login.

Aggiorna questo pacchetto alla versione 3.1.0 pre-rilascio, puoi usare quanto segue:

Pacchetto di installazione Microsoft.Owin.Security.Facebook -Pre

Come altri correttamente menzionati, il più delle volte è perché non hai l’authorization per l’API di Google+, ecco come ottenere l’authorization per un progetto in Google API Manager all’API di Google+

Passaggio 1. Seleziona il progetto dalla casella combinata in alto e vai a Dashboard> Abilita API inserisci la descrizione dell'immagine qui

Passaggio 2: cerca Google plus e selezionalo inserisci la descrizione dell'immagine qui

Passaggio 3: triggerslo! inserisci la descrizione dell'immagine qui

se torni alla dashboard per quel progetto, puoi vedere l’elenco delle API abilitate per quel progetto in fondo inserisci la descrizione dell'immagine qui

So che è sciocco, ma dopo una lunga lotta, il riavvio di IIS ha risolto il problema per me.

Questo ha risolto il mio problema:

Abilita l’API di Google+. Questo è un getcha ed è la causa principale del problema nella domanda qui – se non lo fai, è facile perdere che la Request to /account/ExternalLoginCallback includa &error=access_denied , e questo perché Google ha detto no ad un le autorizzazioni richiedono OWIN creato per il profilo di base di Google+ dell’utente. Non posso dire di chi sia la colpa, di Google o di Microsoft.

Per abilitare l’API di Google+ nella Developers Console, fai clic su API a sinistra, cerca su Google+, fai clic su di esso e seleziona Attiva.

L’ho fatto funzionare semplicemente aggiornando tutto il pacchetto nugget nell’applicazione e ha funzionato.

Ho fatto quanto segue per farlo funzionare.

Accedi al portale per sviluppatori, individua la tua applicazione e fai quanto segue.

Dettagli app> Piattaforms elencate centrate su app> Seleziona Sì per il sito web

Ho partecipato a questo problema oggi e ho scoperto che ho definito il cookie remoto dopo aver assegnato i provider.

Assicurati di posizionare …

 app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

prima…

 app.UseFacebookAuthentication( appId: "", appSecret: ""); 

Anche se le risposte sopra sono tutte valide, nel mio caso nessuna di queste ha funzionato: ho controllato e ricontrollato le impostazioni di Google e sono d’accordo con Chris Moschini sul fatto che ci sono molte informazioni fuorvianti.

Per me è stato un “doh momento in cui ho capito che il mio servizio di stato Out of Process non era stato avviato ! Nessun errore (dato che un accesso era la prima cosa che stavo tentando dopo un riavvio in cui il servizio di stato è impostato su avvio manuale sulla macchina) solo un valore Null da GetExternalLoginInfoAsync

Spero che questo aiuti qualcun altro.

Dopo molte ricerche e grattacapi oltre a seguire numerose risposte di aringhe rosse qui su Stackoverflow, alla fine ho esaminato tutte le mie opzioni sulla mia console Google Dev e ho scoperto un piccolo pulsante [Abilita] blu nella pagina di panoramica dell’API di Google +. Ho cliccato su questo e hey presto ha funzionato. Dimentica tutti i baloney che hai letto sull’URL di callback e sulle rotte di navigazione, OWIN sovrascrive il google default / signin-google redirect uri in ogni caso e ti rimanda a ExternalLoginCallback. Attacca solo con l’implementazione predefinita, tutto andrà bene fino a quando attivi la tua API di Google +.

Volevo contribuire anche a questo. Recentemente ho funzionato. Ho avuto il problema con GetExternalLoginInfoAsync restituendo null ma solo in produzione.

Dopo un sacco di ricerche ho finalmente trovato la mia risposta era semplicemente un problema con il mio database. In produzione avevo impostato la stringa di connessione sbagliata in modo che non si connettesse correttamente, ma sostanzialmente non ne parlava. L’unica cosa che accadeva era GetExternallLoginInfoAsync restituito null. Quindi controlla la stringa di connessione al database se questo accade!

Anche in un sidenote, l’unica cosa necessaria per ottenere questo lavoro era:

  • Configura un progetto nella console di Google
  • Abilita l’API di Google+
  • Copia il tuo ID client e il segreto del client nel file Startup.Auth.cs.

Non è necessario abilitare HTTPS, non è necessario creare percorsi personalizzati. Ma assicurati che il tuo database funzioni correttamente!

Per coloro che stanno riscontrando questo problema per Web Api. Altre soluzioni non aiutano AuthenticationManager.GetExternalLoginInfoAsync(); ritorna sempre nullo anche google plus api è abilitato.

usa questa funzione personalizzata per ottenere logininfo. ovviamente Microsoft ha un bug per GetExternalLoginInfoAsync quando richiede su web API.

 private async Task AuthenticationManager_GetExternalLoginInfoAsync_WithExternalBearer() { ExternalLoginInfo loginInfo = null; var result = await Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalBearer); if (result != null && result.Identity != null) { var idClaim = result.Identity.FindFirst(ClaimTypes.NameIdentifier); if (idClaim != null) { loginInfo = new ExternalLoginInfo() { DefaultUserName = result.Identity.Name == null ? "" : result.Identity.Name.Replace(" ", ""), Login = new UserLoginInfo(idClaim.Issuer, idClaim.Value) }; } } return loginInfo; } 

Tutte le altre risposte non hanno risolto questo problema per me, quindi se sei nella stessa barca assicurati che l’azione del tuo controller di registrazione abbia l’attributo RequireHttps:

  // GET: /Account/LoginRegister [AllowAnonymous] [RequireHttps] public ActionResult LoginRegister() { return View(new RegisterLoginViewModel()); }