L'authentification Google en utilisant OWIN Oauth dans MVC5 ne frappe pas la fonction ExternalLoginCallback

Je suis en train de mettre à jour mon processus de login pour que Google utilise OAuth avant qu'ils dépricate leur méthode de login OpenID.

les étapes que j'ai identifiées jusqu'à présent est que J'ai mis à jour le paquet Microsoft.Owin.Sécurité.Google à la version 2.1.0 comme 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: obtenir ExtraData de MVC5 cadre OAuth/OWin fournisseur d'identité avec auth externe fournisseur

le code au démarrage.Auth.cs (qui inclut aussi l'authentification Facebook) va de ceci:

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

        app.UseGoogleAuthentication();

à ceci:

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 que j'ai ajouté des options à L'authentification Google, mon application ne permet pas L'action ExternalLoginCallback être appelé pour google ou facebook (aucun changement au code facebook, mais le problème affecte encore il.)

à l'avant, après avoir cliqué sur les boutons d'ouverture de session externes, la page me redirige vers le lien ci-dessous et retourne un écran blanc vide

https....../en / Account / ExternalLoginCallback#__=_ (il n'y a en fait qu'un seul underscore avant le signe=, donc la syntaxe le supprime si je l'ai tel qu'il apparaît sur ma barre d'adresse).

pour facebook et

http....../fr/Compte/ExternalLoginCallback

pour google. Il n'utilise pas la méthode controller ci-dessous comme il le fait normalement (j'ai essayé de placer des points de débogage dans cette fonction et il ne s'arrête jamais lorsqu'il y a 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, il ne fait que revenir à L'ancien login OpenID et fonctionne à nouveau très bien.

est-ce que je manque quelque chose de simple ici? ou y a-t-il quelque chose de mal à L'intérieur de L'Owin?Sécurité.Google Library qui est à l'origine du problème?

23
demandé sur Community 2014-04-15 04:45:48

4 réponses

Essayez seulement ce

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

cela a fonctionné pour moi

14
répondu Suhas Joshi 2014-04-15 20:44:08

j'utilise la valeur par défaut ASP.NET modèle MVC 5 avec authentification D'identité pour plus de simplicité, mais avec un peu de chance cela peut être modifié pour différents cas d'utilisation.

StartupAuth.cs

ne pas personnaliser le chemin de redirection. Il est remplacé par /signer-google de toute façon et mes tentatives de contourner cela a causé 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 ajouter http://whatever.com/signin-google à https://console.developers.google.com / dans votre APIs & auth > Credentials > Redirect URIs section.

RouteConfig.cs

ajouter une route à une action permanente de redirection du contrôleur sur vos routes. Redirections permanentes sont la seule chose qui suffira ici. Il ne suffit pas de simplement 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 vous devriez vous en sortir.

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

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

19
répondu Alexander Pritchard 2015-02-26 05:47:28

assurez-vous que vous avez également activé L'API Google+ dans votre console de développement. Il s'agit d'une étape supplémentaire après que vous avez votre client et secret

12
répondu Aaron Sherman 2015-08-21 15:05:26

comme @Ronen l'a dit dans les commentaires, ce lien devrait résoudre les problèmes avec Google outh 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

met également à jour les paquets OWIN de NuGet. Voici à quoi ressemble mon code et il fonctionne bien:

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

       app.UseGoogleAuthentication(googleOptions);
3
répondu Rick 2015-04-28 02:42:59