web-dev-qa-db-fra.com

Authentification Google utilisant OWIN Oauth dans MVC5 ne frappant pas la fonction ExternalLoginCallback

Je suis en train de mettre à jour mon processus de connexion pour que Google utilise OAuth avant de priver sa méthode de connexion OpenID.

Les étapes que j'ai identifiées jusqu'à présent sont que j'ai mis à niveau le package Microsoft.Owin.Security.Google vers la version 2.1.0 car cette version inclut la possibilité d'inclure des options dans la méthode UseGoogleAuthentication.

J'ai essayé d'utiliser la solution d'Alex Wheat dans le lien: Get ExtraData from MVC5 framework OAuth/OWin identity provider with external auth provider

Le code dans Startup.Auth.cs (qui inclut également l'authentification Facebook) va de ceci:

    var facebookAuthenticationOptions = new FacebookAuthenticationOptions()
        {
            AppId = "MYAPPID",
            AppSecret = "MYSECRET"
        };
        facebookAuthenticationOptions.Scope.Add("email");
        app.UseFacebookAuthentication(facebookAuthenticationOptions);

        app.UseGoogleAuthentication();

Pour ça:

var facebookAuthenticationOptions = new FacebookAuthenticationOptions()
        {
            AppId = "MYAPPID",
            AppSecret = "MYSECRET"
        };
        facebookAuthenticationOptions.Scope.Add("email");
        app.UseFacebookAuthentication(facebookAuthenticationOptions);


        var googleOAuth2AuthenticationOptions = new GoogleOAuth2AuthenticationOptions
        {
            ClientId = "MYCLIENTID",
            ClientSecret = "MYSECRET",
            CallbackPath = new PathString("/en/Account/ExternalLoginCallback"),
            Provider = new GoogleOAuth2AuthenticationProvider()
            {

            }
        };

        app.UseGoogleAuthentication(googleOAuth2AuthenticationOptions);

Après avoir ajouté des options à l'authentification Google, mon application ne permet pas d'appeler l'action ExternalLoginCallback pour google ou facebook (aucune modification du code facebook mais le problème l'affecte toujours).

Sur le front-end, après avoir cliqué sur les boutons de connexion externes, la page me redirige vers le lien ci-dessous et renvoie un écran blanc vide

https ....../fr/Account/ExternalLoginCallback # __ = _ (Il n'y a en fait qu'un seul trait de soulignement avant le signe =, SO le supprime si je l'ai comme il apparaît) sur ma barre d'adresse).

pour facebook et

https ....../fr/Account/ExternalLoginCallback

pour google. Il ne frappe pas la méthode du contrôleur ci-dessous comme il le fait normalement (j'ai essayé de placer des points d'arrêt de débogage dans cette fonction et il ne s'arrête jamais lorsqu'il existe des options d'authentification Google.

    // GET: /Account/ExternalLoginCallback
    [AllowAnonymous]
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {

Si je supprime les options d'authentification de Google Authentication, cela revient simplement à l'ancienne connexion OpenID et fonctionne à nouveau correctement.

Suis-je en train de manquer quelque chose de simple ici? ou y a-t-il quelque chose de mauvais qui se passe à l'intérieur de la bibliothèque Owin.Security.Google qui cause le problème?

24
Brad Baskin

Essayez seulement ceci

var googleOAuth2AuthenticationOptions = new GoogleOAuth2AuthenticationOptions
        {
            ClientId = "MYCLIENTID",
            ClientSecret = "MYSECRET",
        };
app.UseGoogleAuthentication(googleOAuth2AuthenticationOptions);

Cela a fonctionné pour moi

15
Suhas Joshi

J'utilise le modèle ASP.NET MVC 5 par défaut avec l'authentification d'identité pour plus de simplicité, mais j'espère que cela peut être modifié pour différents cas d'utilisation.

StartupAuth.cs

Ne personnalisez pas le chemin de redirection. Il est de toute façon remplacé par/signin-google et mes tentatives de contournement ont provoqué des erreurs "silencieuses" (pas dans le débogueur) du serveur interne 500.

app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
{
    ClientId = "whatevs.apps.googleusercontent.com",
    ClientSecret = "whatevs_secrut",
    Provider = new GoogleOAuth2AuthenticationProvider()
});

Assurez-vous d'ajouter http://wwhat.com/signin-google à https://console.developers.google.com/ dans votre APIs & auth> Credentials> Redirect URIs section.

RouteConfig.cs

Ajoutez un itinéraire à une action de contrôleur de redirection permanente à vos itinéraires. Les redirections permanentes sont la seule chose qui suffira ici. Il ne suffit pas de diriger directement vers l'URL de rappel.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Google API Sign-in",
        url: "signin-google",
        defaults: new { controller = "Account", action = "ExternalLoginCallbackRedirect" }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

AccountController.cs

Redirection permanente vers la méthode de rappel intégrée et tout devrait bien se passer.

[AllowAnonymous]
public ActionResult ExternalLoginCallbackRedirect(string returnUrl)
{
    return RedirectPermanent("/Account/ExternalLoginCallback");
}

Un projet de modèle a été publié sur GitHub pour référence: https://github.com/Pritchard/Test-AspNetGoogleOAuth2Authentication

20
Alexander Pritchard

Assurez-vous que vous avez également activé l'API Google+ dans votre console de développeur. C'est une étape supplémentaire après avoir votre client et votre secret

13
Aaron Sherman

Comme @Ronen l'a dit dans les commentaires, ce lien devrait résoudre les problèmes avec Google OAuth dans MVC5:

http://blogs.msdn.com/b/webdev/archive/2014/07/02/changes-to-google-oauth-2-0-and-updates-in-google-middleware-for- 3-0-0-rc-release.aspx

Mettez également à jour les packages OWIN de NuGet. Voici à quoi ressemble mon code et fonctionne très bien:

       var googleOptions = new GoogleOAuth2AuthenticationOptions ()
       {
           ClientId = "xxxxxxxxxx",
           ClientSecret = "xxxxxxxxxx",
           CallbackPath = new PathString("/signin-google")
       };
       googleOptions.Scope.Add("email");

       app.UseGoogleAuthentication(googleOptions);
3
Rick