with services net mvc example crear asp c# .net asp.net-mvc owin google-openid

c# - services - GetExternalLoginInfoAsync de OWIN siempre devuelve null



mvc 5 login example in c# (14)

Aunque las respuestas anteriores son todas buenas, en mi caso, ninguna de estas funcionó. Revisé y volví a revisar 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 difícil cuando me di cuenta de que mi servicio de estado fuera de proceso no se había iniciado . Sin errores (como lo primero que intenté después de un reinicio cuando el inicio de sesión fue configurado como inicio manual en la máquina) fue solo un nulo de GetExternalLoginInfoAsync

Espero que esto ayude a alguien más.

He creado una nueva aplicación web MVC5, y cuando intento iniciar sesión con Google o Facebook, se llama a la Acción ExternalLoginCallback en el AccountController , pero GetExternalLoginInfoAsync() siempre devuelve null:

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

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


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

Paso 1. Seleccione Su proyecto en el cuadro combinado superior y vaya a Panel de control> Habilitar API

Paso 2: Busca Google plus y selecciónalo

Paso 3: Habilitarlo!

Si regresa al panel de control para ese proyecto, puede ver la lista de API habilitadas para ese proyecto en la parte inferior.


Después de mucho buscar y rascar la cabeza, así como seguir las numerosas respuestas sobre pistas falsas aquí en , eventualmente 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 descripción general de la API de Google +. Hice clic en este y hey presto funcionó. Olvídese de todo lo que haya leído sobre la url de devolución de llamada y las configuraciones de ruta, OWIN anula el uri de redireccionamiento predeterminado de Google / signin-google en cualquier caso y lo envía de vuelta a ExternalLoginCallback. Simplemente apégate a la implementación predeterminada, todo estará bien siempre y cuando habilites tu API de Google +.


Esto solucionó mi problema:

Habilitar 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 se debe a que Google dijo que no a 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 la Consola de desarrolladores, haga clic en API a la izquierda, busque Google+, haga clic en eso y presione Activar.


Hice lo siguiente para que funcione.

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

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


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


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

Asegúrate de colocar ...

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

antes de...

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


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


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.

Utilice esta función personalizada para obtener logininfo. obviamente, Microsoft tiene un error para GetExternalLoginInfoAsync cuando se solicita a través de la API web.

private async Task<ExternalLoginInfo> 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; }


Para que el inicio de sesión de OWIN Google funcione correctamente en un sitio estándar de 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 devolución de llamada allí en blah/signin-google .
    Notas importantes sobre cosas que no necesitas hacer:

    • No es necesario utilizar HTTPS para Google para redirigir de nuevo; Incluso puede redirigir nuevamente a http: // localhost , sin problemas.

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

Como ejemplo, si su sitio era me.com, podría tener estas 3 URL de devolución de llamada 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, incluido el número de puerto que VS le dio para su proyecto.

  1. Habilitar 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 la Solicitud a /account/ExternalLoginCallback incluye &error=access_denied , y eso es porque Google rechazó una solicitud de permisos que OWIN realizó 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 la Consola de desarrolladores, haga clic en API a la izquierda, busque Google+, haga clic en eso y presione Activar. Sí, realmente necesitas hacer eso. Si no haces eso, estás atado.

  1. Agregue el ClientId y el ClientSecret que Google le entregó en la Consola de Desarrolladores a 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 como que OWIN / Google no funciona, y casi todas están equivocadas con la plantilla actual VS2013 / MVC5 / OWIN.
No necesitas modificar Web.Config en absoluto.
No necesitas crear ninguna ruta especial en absoluto.
No debe intentar apuntar /signin-google a un lugar diferente, o usar una URL de devolución de llamada diferente, y definitivamente no debe intentar vincularlo directamente a /account/externallogincallback o externalloginconfirmation , ya que ambos están separados de /signin-google y los pasos necesarios en el proceso OWIN / Google.


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

Actualice este paquete a la versión 3.1.0 anterior al lanzamiento, puede usar lo siguiente:

Paquete de instalación Microsoft.Owin.Security.Facebook -Pre


Quería contribuir a esto también. Hace poco conseguí este trabajo. Tuve el problema de que GetExternalLoginInfoAsync devolvía un valor nulo pero solo en producción.

Después de mucho buscar, finalmente encontré mi respuesta, simplemente fue un problema con mi base de datos. En la producción, había establecido la cadena de conexión incorrecta para que no se conectara correctamente, pero básicamente estaba en silencio al respecto. Lo único que sucedió fue que GetExternallLoginInfoAsync devolvió un valor nulo. ¡Así que revisa tu cadena de conexión de 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 su ID de cliente y su secreto de 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 funcione correctamente!


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


Todas las otras respuestas no solucionaron esto, así que si está en el mismo barco, asegúrese de que la acción del controlador de registro tenga el atributo RequireHttps:

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