Identité ASP.NET Middleware Middleware Google OAuth2 AuthenticationManager SignIn ne fonctionne pas

J’ai créé un simple site Web ASP.NET MVC4 pour tester le nouveau middleware d’authentification OWIN. J’ai décidé de commencer par Google Le problème que j’ai actuellement, c’est que OWIN n’authentifie pas l’utilisateur.

Je pense avoir les parameters appropriés dans la configuration Web

        

Ensuite, j’ai dans la classe de démarrage une configuration très simple

 public partial class Startup { public void Configuration(IAppBuilder app) { ConfigureAuth(app); } public void ConfigureAuth(IAppBuilder app) { app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); // Enable the External Sign In Cookie. app.SetDefaultSignInAsAuthenticationType(DefaultAuthenticationTypes.ExternalCookie); // Enable Google authentication. app.UseGoogleAuthentication(GetGoogleOptions()); } private static GoogleOAuth2AuthenticationOptions GetGoogleOptions() { var reader = new KeyReader(); var keys = reader.GetKey("google"); var options = new GoogleOAuth2AuthenticationOptions() { ClientId = keys.Public, ClientSecret = keys.Private }; return options; } } 

Dans AccountController j’ai codé les actions de la manière suivante, ce qui est à nouveau très simple mais devrait fonctionner.

 [AllowAnonymous, HttpPost, ValidateAntiForgeryToken] public ActionResult ExternalLogin(ssortingng provider, ssortingng returnUrl) { return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl })); } [AllowAnonymous, HttpGet] public async Task ExternalLoginCallback(ssortingng returnUrl) { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null || !loginInfo.ExternalIdentity.IsAuthenticated) { return RedirectToAction("Login"); } var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, loginInfo.DefaultUserName), new Claim(ClaimTypes.Email, loginInfo.Email) }, DefaultAuthenticationTypes.ExternalCookie); AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = false }, identity); return RedirectToLocal(returnUrl); } 

Le principal problème que je rencontre est que l’appel à la méthode AuthenticationManager.SignIn ne semble rien faire, même si Google accorde l’access à la demande, lorsque l’utilisateur est redirigé vers la page d’accueil dans laquelle j’ai le code suivant

 @using Microsoft.AspNet.Identity @{ Layout = "~/Views/Shared/_Main.cshtml"; } 

Welcome

@{ if (Request.IsAuthenticated) {

Welcome @User.Identity.GetUserName()

} else { @Html.ActionLink("Login", "Login", "Account") } }

La valeur de Request.IsAuthenticated est toujours fausse. Quelqu’un a-t-il une idée de ce qui me manque ici? D’après ce que j’ai lu en ligne, cela devrait fonctionner.

Des cookies sont activés dans mon navigateur et dans d’autres exemples Google OAuth UserManager sur la classe UserManager , mais cette implémentation simple ne fonctionne pas.

Après d’innombrables heures de lecture sur le Web pour trouver des réponses, j’ai décidé de déboguer le code source OWIN pour trouver une solution à ce problème, alors que la session de débogage m’avait confrontée dans cette gemme de la classe AuthenticationHandler .

 if (BaseOptions.AuthenticationMode == AuthenticationMode.Active) { AuthenticationTicket ticket = await AuthenticateAsync(); if (ticket != null && ticket.Identity != null) { Helper.AddUserIdentity(ticket.Identity); } } 

Dans ma classe de Startup origine, Startup le cookie de connexion externe avec cette méthode

 app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

Cette méthode utilisait une instance par défaut de CookieAuthenticationOptions dont AuthenticationMode = AuthenticationMode.Passive empêchait la classe de lire les informations stockées dans le cookie. Ainsi, à chaque nouvelle demande, OwinContext ne chargeait pas l’identité authentifiée et aboutissait à Request.IsAuthenticated

Après avoir réalisé cela, je n’ai fait que changer app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); avec ça

 app.UseCookieAuthentication(new CookieAuthenticationOptions() { AuthenticationMode = AuthenticationMode.Passive, AuthenticationType = DefaultAuthenticationTypes.ExternalCookie, ExpireTimeSpan = TimeSpan.FromMinutes(30) }); 

et tout a fonctionné à merveille

J’avais le même problème, mais tout ce que j’avais à faire, c’était d’append “Google + API” à ma liste d’APIS dans la console de développement de Google. Après cela, tout a fonctionné.