Provedor OpenID OWIN – GetExternalLoginInfo () retorna null

Eu estou tendo problema com provedores OWIN OpenId em um aplicativo asp.net MVC5 que usa o ASP.NET Identity e é baseado no modelo VS2013 com autenticação de conta de usuário individual. Os provedores OWIN OpenID para o Google e LinkedIn são usados ​​para autenticação de login.

O problema é que o que parece ser muito random; GetExternalLoginInfo () retorna null no retorno de chamada LoginConfirmation, mesmo que a autenticação de logon tenha sido bem-sucedida.

var authManager = HttpContext.Current.GetOwinContext().Authentication; var login = authManager.GetExternalLoginInfo(); 

Os provedores em uso são o Google (Microsoft.Owin.Security.Google 2.1.0) e o LinkedIn (do Owin.Security.Providers 1.3) e ambos provedores causam o mesmo problema.

Às vezes, ele falha uma vez e depois funciona novamente, mas às vezes continua a falhar até que o AppPool seja reciclado.

Atualmente, duas instâncias do aplicativo são hospedadas no IIS na mesma máquina virtual do Windows Azure. Cada instância tem seu próprio AppPool, mas configurações idênticas (subdomínios diferentes). Às vezes, o login pára de funcionar em uma instância, mas ainda funciona na outra instância.

O problema foi reproduzido localmente também (IIS Express – VS2013).

Alguém experimentou problemas semelhantes com a autenticação OWIN OpenID?

Startup.Auth.cs tem esta aparência:

 public void ConfigureAuth(IAppBuilder app) { // Enable the application to use a cookie to store information for the signed in user app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login"), }); // Use a cookie to temporarily store information about a user logging in with a third party login provider app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); app.UseGoogleAuthentication(); app.UseLinkedInAuthentication("clientId", "clientSecret"); } 

Os seguintes pacotes nuget OWIN estão em uso:

                   

   

O problema ocorre quando o cookie ASP.NET_SessionId está faltando.

Definir um valor fictício na session antes de redirect para o provedor OpenID para credenciais parece resolver o problema:

 [AllowAnonymous] public ActionResult Login(string returnUrl) { Session["dummy"] = "dummy"; // Create ASP.NET_SessionId cookie return View(); } 

Mais detalhes nesta resposta: https://stackoverflow.com/a/21234614/205023

Para mim, colocando ControllerContext.HttpContext.Session.RemoveAll(); em AccountController e ManageController, resolveu o problema:

  public ActionResult ExternalLogin(string provider, string returnUrl) { ControllerContext.HttpContext.Session.RemoveAll(); // Request a redirect to the external login provider return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl })); } 

e

  public ActionResult LinkLogin(string provider) { ControllerContext.HttpContext.Session.RemoveAll(); // Request a redirect to the external login provider to link a login for the current user return new AccountController.ChallengeResult(provider, Url.Action("LinkLoginCallback", "Manage"), User.Identity.GetUserId()); } 

A resposta aceita não resolveu o problema para mim; O que funcionou foi ativar a “API do Google+” no Gerenciador de APIs do Google Developers Console.

Estou usando o SecuritySwitch para configurar as páginas seguras e não seguras, e o motivo do meu problema é que o caminho / signin-google foi redirecionado para uma solicitação não segura, em vez de usar a solicitação segura.

A abordagem correta aqui é apenas atualizar todos os componentes owin da solução.