El GetExternalLoginInfoAsync de OWIN siempre devuelve null

Creé una nueva aplicación web MVC5, y cuando bash iniciar sesión en Google o Facebook, se llama a la acción ExternalLoginCallback en AccountController , pero GetExternalLoginInfoAsync() siempre devuelve null:

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

Como siempre es nulo, solo redirige a la página de inicio de sesión y el proceso comienza de nuevo. ¿Cómo puedo arreglar esto?

Para que el inicio de sesión de OWIN Google funcione correctamente en un sitio estándar Visual Studio 2013, ASP.Net MVC5, tuve que:

  1. Configure una cuenta de Google OpenId en https://console.developers.google.com/project

  2. Establezca la URL de callback allí para blah/signin-google .
    Notas importantes sobre cosas que no necesita hacer:

    • No es necesario que use HTTPS para que Google redireccione; incluso puede redireccionar a http: // localhost , no hay problema.

    • No necesita configurar nada para la URL de redireccionamiento: no hay rutas, acciones de controlador ni permisos especiales en Web.Config. La URL de redireccionamiento siempre es / signin-google y OWIN maneja esto detrás de escena para usted.

Como ejemplo, si su sitio es me.com, puede tener estas 3 URL de callback en la Consola de desarrollador de Google:

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

El primero incluye el número de puerto VS que le dio para su proyecto.

  1. Habilita la API de Google+ . Este es un b **** oculto de un gotcha y es la causa raíz del problema en la pregunta aquí; si no lo hace, es fácil pasar por alto que el Request to /account/ExternalLoginCallback incluye &error=access_denied , y eso se debe a que Google dijo que no a una solicitud de permisos realizada por OWIN para el perfil básico de Google+ del usuario. No puedo decir de quién es la culpa, de Google o de Microsoft.

Para habilitar la API de Google+ en Developers Console, haga clic en API a la izquierda, busque Google+, haga clic en eso y presione Activar. Sí, realmente necesitas hacer eso. Estás con manguera si no haces eso.

  1. Agregue el ClientId y ClientSecret que Google le asignó en Developers Console para Startup.Auth, pero mejore el código en el proceso para usar OAuth2 explícitamente y solicite explícitamente la dirección de correo electrónico del usuario:

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

Eso es. Eso finalmente lo hizo funcionar.

Solo quiero reiterar una vez más, hay MUCHAS respuestas sobre esto y problemas similares en los que OWIN / Google no funciona, y casi todos son incorrectos para la plantilla VS2013 / MVC5 / OWIN actual.
No necesita modificar Web.Config en absoluto.
No necesita crear ninguna Ruta especial en absoluto.
No debe intentar apuntar /signin-google en un lugar diferente, o utilizar una URL de callback diferente, y definitivamente no debe intentar vincularlo directamente a /account/externallogincallback o externalloginconfirmation , porque ambos están separados de /signin-google y los pasos necesarios en el proceso de OWIN / Google.

OK, descubrí por qué es nulo. Debes habilitar Google + API en la consola de Google. También asegúrese de que la clave secreta no se concatene con un espacio al final después de pegarlo en su código. ¿Por qué no pueden devolver un error normal? No lo sé.

Parece que el paquete Nuget Microsoft.Owin.Security.Facebook versión 3.0.1 ya no funciona con Facebook Login.

Actualice este paquete a la versión preliminar 3.1.0, puede usar lo siguiente:

Install-Package Microsoft.Owin.Security.Facebook -Pre

Como otros mencionaron correctamente, la mayoría de las veces es porque no tienes permiso para la API de Google+, así que aquí tienes cómo obtener permiso para un proyecto en el Administrador de API de Google en la API de Google+.

Paso 1. Selecciona tu proyecto en el cuadro combinado superior y ve a Panel> Habilitar API enter image description here

Paso 2: busque Google plus y selecciónelo enter image description here

Paso 3: ¡ habilítalos! enter image description here

si regresas al panel para ese proyecto, puedes ver la lista de API habilitadas para ese proyecto en la parte inferior enter image description here

Sé que es una tontería, pero después de una larga lucha, reiniciar IIS resolvió el problema para mí.

Esto resolvió mi problema:

Habilita la API de Google+. Esto es un problema y es la causa raíz del problema en la pregunta aquí; si no lo hace, es fácil pasar por alto que la Solicitud a /account/ExternalLoginCallback incluye &error=access_denied , y eso es porque Google dijo no a un solicitud de permisos OWIN hecha para el perfil básico de Google+ del usuario. No puedo decir de quién es la culpa, de Google o de Microsoft.

Para habilitar la API de Google+ en Developers Console, haga clic en API a la izquierda, busque Google+, haga clic en eso y presione Activar.

Lo hice funcionar simplemente al actualizar todo el paquete de nugget en la aplicación y funcionó.

Hice lo siguiente para que funcione.

Inicie sesión en el portal del desarrollador, ubique su aplicación y haga lo siguiente.

Detalles de la aplicación> Plataformas enumeradas centradas en la aplicación> Seleccionar Sí para el sitio web

Me encontré con este problema hoy y resultó que definí la cookie remota después de asignar los proveedores.

Asegúrate de colocar …

 app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

antes de…

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

Aunque las respuestas anteriores son buenas, en mi caso, ninguna de ellas funcionó: revisé y comprobé dos veces la configuración de Google y estoy de acuerdo con Chris Moschini en que hay mucha información engañosa.

¡Para mí fue un momento doh cuando me di cuenta de que mi servicio estatal Out of Process no había comenzado ! Sin errores (como inicio de sesión fue lo primero que intenté después de un reinicio donde el servicio de estado está configurado para el inicio manual en la máquina) solo un nulo de GetExternalLoginInfoAsync

Espero que esto ayude a alguien más.

Después de mucho buscar y arañar la cabeza, así como seguir numerosas respuestas al arenque rojo aquí en Stackoverflow finalmente revisé todas mis opciones en mi consola de desarrollo de Google y descubrí un pequeño botón azul [Habilitar] en la página de resumen de la API de Google +. Hice clic en esto y hasta que funcionó. Olvídese de todas las tonterías que leyó sobre la URL de callback y las configuraciones de ruta, OWIN anula el uri de redirección / inicio de sesión google default en cualquier caso y lo envía de regreso a ExternalLoginCallback. Simplemente mantente con la implementación predeterminada, todo estará bien siempre y cuando habilites tu Google + API.

Yo quería contribuir a este también. Hace poco conseguí que esto funcionara. Tuve el problema con GetExternalLoginInfoAsync devolviendo nulo pero solo en producción.

Después de mucha búsqueda finalmente encontré mi respuesta, simplemente era un problema con mi base de datos. En producción, configuré una cadena de conexión incorrecta para que no se conectara correctamente, pero básicamente era silenciosa al respecto. Lo único que sucedió fue GetExternallLoginInfoAsync devuelto nulo. ¡Así que compruebe la cadena de conexión de la base de datos si esto sucede!

También en una nota al margen, lo único que se necesitaba para que esto funcionara era:

  • Configura un proyecto en la consola de Google
  • Habilitar API de Google+
  • Copie la identificación de su cliente y el secreto del cliente en el archivo Startup.Auth.cs.

No tiene que habilitar HTTPS, no tiene que crear rutas personalizadas. ¡Pero asegúrese de que su base de datos esté funcionando correctamente!

Para aquellos que están experimentando este problema para Web Api. Otras soluciones no ayudan a AuthenticationManager.GetExternalLoginInfoAsync(); devuelve siempre nulo, incluso google plus api está habilitado.

use esta función personalizada para obtener logininfo. Obviamente, Microsoft tiene un error para GetExternalLoginInfoAsync cuando solicita sobre la API web.

 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; } 

Todas las demás respuestas no me solucionaron esto, así que si estás en el mismo barco, asegúrate de que tu acción de controlador de registro tenga el atributo RequireHttps:

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