在 MVC5 中使用 OWIN Oauth 的 Google 身份验证未命中 ExternalLoginCallback 函数

Posted

技术标签:

【中文标题】在 MVC5 中使用 OWIN Oauth 的 Google 身份验证未命中 ExternalLoginCallback 函数【英文标题】:Google Authentication using OWIN Oauth in MVC5 not hitting ExternalLoginCallback function 【发布时间】:2014-05-29 03:53:36 【问题描述】:

我目前正在升级我的登录过程,以便 Google 在他们弃用其 OpenID 登录方法之前使用 OAuth。

到目前为止,我已确定的步骤是将包 Microsoft.Owin.Security.Google 升级到版本 2.1.0,因为该版本包括在 UseGoogleAuthentication 方法中包含选项的能力。

我尝试在链接中使用 Alex Wheat 的解决方案: Get ExtraData from MVC5 framework OAuth/OWin identity provider with external auth provider

Startup.Auth.cs 中的代码(其中还包括 Facebook 身份验证)来自:

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

        app.UseGoogleAuthentication();

到这里:

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);

在向 Google 身份验证添加选项后,我的应用不允许为 google 或 facebook 调用 ExternalLoginCallback 操作(没有更改 facebook 代码,但问题仍然会影响它)。

在前端,点击外部登录按钮后,页面将我重定向到下面的链接并返回一个空白屏幕

https.......

脸书和

https....../en/Account/ExternalLoginCallback

对于谷歌。它没有像往常一样点击下面的控制器方法(我试图在这个函数中放置调试断点,当有谷歌身份验证选项时它永远不会停止。

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

如果我从 Google 身份验证中删除身份验证选项,它只会恢复到旧的 OpenID 登录并再次正常工作。

我在这里遗漏了一些简单的东西吗?还是在导致问题的 Owin.Security.Google 库中发生了什么不好的事情?

【问题讨论】:

【参考方案1】:

为了简单起见,我使用带有身份验证的默认 ASP.NET MVC 5 模板,但希望可以针对不同的用例进行修改。

StartupAuth.cs

不要自定义重定向路径。无论如何,它都被 /signin-google 取代了,而我试图绕过这导致“静默”(不在调试器中)内部服务器 500 错误。

app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()

    ClientId = "whatevs.apps.googleusercontent.com",
    ClientSecret = "whatevs_secrut",
    Provider = new GoogleOAuth2AuthenticationProvider()
);

确保在APIs &amp; auth > Credentials > Redirect URIs 部分中将http://whatever.com/signin-google 添加到https://console.developers.google.com/。

RouteConfig.cs

将路由添加到您的路由的永久重定向控制器操作。永久重定向是这里唯一足够的东西。仅仅直接指向回调 URL 是不够的。

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

永久重定向到内置回调方法,你应该没问题。

[AllowAnonymous]
public ActionResult ExternalLoginCallbackRedirect(string returnUrl)

    return RedirectPermanent("/Account/ExternalLoginCallback");

已经在GitHub上发布了一个模板项目供参考:https://github.com/Pritchard/Test-AspNetGoogleOAuth2Authentication

【讨论】:

您能否解释一下我们为什么需要ExternalLoginCallbackRedirect?为什么不直接在路由配置中直接使用ExternalLoginCallback @MichalHosala 我的猜测是有可能做到这一点。然而,这个问题是从今年 2 月开始的,此时我不再参与回忆上下文所必需的工作。如果有更简单的方法来完成任务,我说去吧! 感谢您的回复,但是,如果我使用 ExternalLoginCallback,那么,令人惊讶的是,它会停止工作,并且在登录后我根本不会重定向到 ExternalLoginCallback... 所以您的代码似乎是正确的,只是不知道我们为什么需要这个额外的步骤:) 供将来参考 - 基于offical guidelines for integrating Google authentication with MVC app 我根本看不出有任何修改 RouteConfig.cs 和 AccountController.cs 的理由。谷歌授权。即使删除了这两个文件中的更改,它仍然可以继续工作(对我而言)。 @MichalHosala 我认为该链接可能值得自己回答 :) 我对这个问题的回答专门针对我在使用 Visual Studio 模板打包的示例网站时遇到的问题。 【参考方案2】:

只试试这个

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

这对我有用

【讨论】:

这解决了我的 facebook 身份验证发生的问题。当我使用 google 时,它​​会尝试转到我网站上的以下链接作为回调 https.../signin-google 你知道如何设置回调路径吗?当我使用原始帖子中的 callbackPath 时,会出现与原始问题相同的问题。 clientID 在 google 中设置为指向我的 ExternalLoginCallback 函数,但它实际上并没有在返回时调用它。 只是为了跟进,使用这种方法似乎会自动使用地址中的signin-google请求。我解决这个问题的方法是将我在谷歌控制台中的谷歌回调位置更改为指向这个地址。我还在我的 RouteConfig 文件中添加了一条路由`routes.MapRoute(name: "signin-google", url: "signin-google", defaults: new controller = "Account", action = "ExternalLoginCallback" );` 谢谢为你的帮助@suhas-joshi @Brad:很抱歉无法尽快回复,但很高兴您找到了解决方案 看看我发现了什么:有关这些更改的详细信息blogs.msdn.com/b/webdev/archive/2014/07/02/…【参考方案3】:

确保您还在开发者控制台中启用了 Google+ API。这是您拥有客户和秘密后的额外步骤

【讨论】:

这为我修好了,ta!可悲的是,在任何 Microsoft 演练中都没有提到这一点...... 这是为我做的!数小时的故障排除,谢谢!【参考方案4】:

正如@Ronen 在 cmets 中所说,此链接应该可以解决 MVC5 中 Google OAuth 的问题:

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

还可以从 NuGet 更新 OWIN 包。这就是我的代码的外观并且运行良好:

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

       app.UseGoogleAuthentication(googleOptions);

【讨论】:

以上是关于在 MVC5 中使用 OWIN Oauth 的 Google 身份验证未命中 ExternalLoginCallback 函数的主要内容,如果未能解决你的问题,请参考以下文章

MVC 5 应用 - 实现 OAuth 授权代码流

使用 MVC5 和 OWIN 的自定义身份

Owin 和 Windows 身份验证 (mvc5) - 使用 Windows 身份验证作为登录的一部分

如何在 OWIN ASP.NET MVC5 中注销用户

在WebApi中基于Owin OAuth使用授权发放Token

扩展 Microsoft.Owin.Security