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é.