MVC5上的Google OAuth ExternalLoginCallback?error = access_denied

时间:2015-05-13 17:34:32

标签: oauth asp.net-mvc-5 google-oauth

我已设置Google OAuth

enter image description here

我已将代码添加到Startup.Auth.cs

 app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
    {
        // LRC
        ClientId = "xxxxxxxxx",
        ClientSecret = "xxxxx"
        //CallbackPath = new PathString("/signin-google")
    });

但在我选择使用Google帐户登录后,它又将我重定向到了登录页面,

我通过Chrome检查了网络,发现访问被拒绝了。

  

http://www.liferunningclub.com.au/Account/ExternalLoginCallback?error=access_denied

我无法理解。

请帮忙。谢谢。

更新 现在我做了别的事: 1.我在帐户控制器上添加了一个注释([RequireHttps]) 2.我为我的项目启用了SSL。 2.我更新了网址并将Google控制台中的网址重定向到https

尝试使用Google登录后,在我选择了我的Google帐户后,它返回了相同的access_denied。

如果Google的回复可以提供更详细的信息会更好。

7 个答案:

答案 0 :(得分:26)

使用最新的ASP.Net MVC模板和#34;个人帐户"我遇到了同样的问题。地选择。

解决方案是在Google Developer Console中为我的项目启用Google+ API。

我找到了答案here(向下滚动到"对Google OAuth 2.0的更改......")。

答案 1 :(得分:3)

Facebook提供商也发生了同样的错误。

事实证明解决方案就像updating the nuget package to 3.1一样简单。

  

事实证明,Facebook对其图谱API进行了“强制升级”   2017年3月27日从2.2版到2.3版

对于记录我正在使用以下内容:

在Facebook中,我为测试应用程序配置了以下设置:

enter image description here

enter image description here

此外,如果您使用的是示例模板,则不会消耗返回的error参数,这可能会产生误导。您应该将string error添加到ExternalLoginCallback

    [AllowAnonymous]
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl, string error)
    {
        if (error != null)
        {
            return View("Error");
        }

答案 2 :(得分:1)

我也有这个问题。启用Google+ API后,问题仍未解决。事实证明,我还没有设定授权的JavaScript来源&#39;在我的谷歌API控制台中。所以我设置了authorized javascript origins,问题就解决了。

答案 3 :(得分:1)

我有同样的问题。我启用了Google+ API,并设置了JavaScript提供程序。原来我的Microsoft.Owin 3.1版本太旧了。我已经更新了每个带有Microsoft.Owin(无论如何)名称的块,并且它可以正常工作(4.1版)

希望有帮助!

答案 4 :(得分:0)

这很可能是因为您尚未在开发者控制台中启用Google + API。

因此,当您的帐户尝试获取有关Google帐户的详细信息时,它会显示access_denied

只需转到开发者控制台并启用Google + API

答案 5 :(得分:0)

以上解决方案均不适合我。事实证明,在我的情况下,我正在对Google OAuth Playground进行调整,并在我的“用于客户ID和机密的Google凭据”的“授权重定向Uris”部分中添加了https://developers.google.com/oauthplayground这个网址。

当我删除并重试它时,它工作正常。

PS:我还必须重置也修改过的OAuth Playground设置。

编辑

另一个问题是,当用户Exception被触发时,我的代码抛出了OnAthenticated EventHandler。产生一个空引用,导致返回access_denied状态。

GoogleOAuth2AuthenticationOptions googleOptions = new GoogleOAuth2AuthenticationOptions()
            {
                ClientId = "xxxxx.apps.googleusercontent.com",
                ClientSecret = "XXXX",
                Provider = new GoogleOAuth2AuthenticationProvider()
                {
                    OnAuthenticated = (context) =>
                    {
                        try
                        {
                            TokenHelper tokenHelper = new TokenHelper();

                            // Any exception here will result in 'loginInfo == null' in AccountController.ExternalLoginCallback.
                            // Be sure to add exception handling here in case of production code.
                            context.Identity.AddClaim(new Claim(tokenHelper.AccessToken, context.AccessToken)); // From This line and onwards. tokenHelper's properties were null.

                            // For clarity, we don't check most values for null but RefreshToken is another kind of thing. It's usually
                            // not set unless we specially request it. Typically, you receive the refresh token only on the initial request,
                            // store it permanently and reuse it when you need to refresh the access token.
                            if (context.RefreshToken != null)
                            {
                                context.Identity.AddClaim(new Claim(tokenHelper.RefreshToken, context.RefreshToken));
                            }

                            // We want to use the e-mail account of the external identity (for which we doing OAuth). For that we save
                            // the external identity's e-mail address separately as it can be different from the main e-mail address
                            // of the current user. 
                            context.Identity.AddClaim(new Claim(tokenHelper.Email, context.Email));
                            context.Identity.AddClaim(new Claim(tokenHelper.Name, context.Name));

                            context.Identity.AddClaim(new Claim(tokenHelper.IssuedOn, DateTime.Now.ToString()));
                            context.Identity.AddClaim(new Claim(tokenHelper.ExpiresIn,
                                ((long)context.ExpiresIn.Value.TotalSeconds).ToString()));

                            return Task.FromResult(0);
                        }
                        catch (Exception ex)
                        {

                            throw;
                        }

                    },
                },
                AccessType = "offline",
                UserInformationEndpoint= "https://www.googleapis.com/oauth2/v2/userinfo"
            };

答案 6 :(得分:0)

默认的Google身份验证不再起作用,您可以通过NuGet添加更新的Owin.Security.Provider.Google程序包或找到它here