【问题标题】:GoogleOAuth2 always return access denied to callback urlGoogleOAuth2 总是返回拒绝访问回调 url
【发布时间】:2022-11-08 22:20:02
【问题描述】:

我试图使用谷歌身份验证扩展Microsoft.Owin.Security.Google

包在 MVC5 程序中。这是我的 StartUp.cs :

   var googlePlusOptions = new GoogleOAuth2AuthenticationOptions {};
    googlePlusOptions.ClientId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com";
    googlePlusOptions.AuthorizationEndpoint = "https://accounts.google.com/o/oauth2/auth";
    googlePlusOptions.TokenEndpoint = "https://oauth2.googleapis.com/token";
    googlePlusOptions.ClientSecret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    googlePlusOptions.CallbackPath = new PathString("/GoogleLoginCallback");
    app.UseGoogleAuthentication(googlePlusOptions);

和 LoginController 内的 SignInMethod 方法:

[HttpGet]
[AllowAnonymous]
public void SignInGoogle(string ReturnUrl = "/", string type = "")
{
    if (!Request.IsAuthenticated)
    {
        if (type == "Google")
        {
            var owinContext = HttpContext.GetOwinContext();
            owinContext.Authentication.Challenge(new AuthenticationProperties { RedirectUri = "Login/GoogleLoginCallback" }, "Google");
            Response.StatusCode = 401;
            Response.End();
        }
    } 
}

和 CallBack Url 在同一个控制器中:

[AllowAnonymous]
    public ActionResult GoogleLoginCallback()
    {
        var claimsPrincipal = HttpContext.User.Identity as ClaimsIdentity;

        var loginInfo = GoogleLoginViewModel.GetLoginInfo(claimsPrincipal);
        if (loginInfo == null)
        {
            return RedirectToAction("Index");
        }



        var user = db.UserAccounts.FirstOrDefault(x => x.Email == loginInfo.emailaddress);

        if (user == null)
        {
            user = new UserAccount
            {
                Email = loginInfo.emailaddress,
                GivenName = loginInfo.givenname,
                Identifier = loginInfo.nameidentifier,
                Name = loginInfo.name,
                SurName = loginInfo.surname,
                IsActive = true
            };
            db.UserAccounts.Add(user);
            db.SaveChanges();
        }

        var ident = new ClaimsIdentity(
                new[] { 
                            // adding following 2 claim just for supporting default antiforgery provider
                            new Claim(ClaimTypes.NameIdentifier, user.Email),
                            new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"),

                            new Claim(ClaimTypes.Name, user.Name),
                            new Claim(ClaimTypes.Email, user.Email),
                            // optionally you could add roles if any
                            new Claim(ClaimTypes.Role, "User")
                },
                CookieAuthenticationDefaults.AuthenticationType);


        HttpContext.GetOwinContext().Authentication.SignIn(
                    new AuthenticationProperties { IsPersistent = false }, ident);
        return Redirect("~/");

    }

现在程序进入谷歌的登录屏幕,但当它回到回调网址时

登录信息一片空白。这是来自 Call Back Url 的响应:

到目前为止我所做的事情没有任何结果: 1-激活 Google+ API 2-将nuget更新到最新版本(4.2 atm) 3-将电子邮件添加到 TestUser 或将谷歌控制台内的项目更改为生产 4-在谷歌控制台中添加并填写同意部分 5-将js回调设置为空白

有点奇怪的一件事是,如果我修改 ClientId,谷歌的登录屏幕会阻止我,但如果我更改 secretId,什么都不会发生,但我仍然看到上面的错误。 我今天从 OAuth 控制台面板中获得了它们(ClientId,SecretId)。

【问题讨论】:

    标签: asp.net-mvc google-api-dotnet-client


    【解决方案1】:

    有了这些问题,如果不重新创建完整的环境设置,就很难准确指出问题所在。因此,我只能尝试解释正在发生的事情,但要获得更精确的解决方案,您将不得不深入研究它。

    基本上我不确定您对 OpenIDConnect 和 OAuth2.0 流程了解多少,但我可以描述您的场景中发生的情况。

    1. 您的应用程序正在将用户重定向到 google 登录页面
    2. 用户正在登录
    3. 成功登录后,谷歌使用这些查询参数将用户浏览器重定向回您的应用程序(屏幕截图上的第三行)
    4. 现在您的应用程序应该获取这些参数并在反向通道(服务器到服务器请求)中将其发送给 google,以将其交换为来自 google 的 access_token。这是一个棘手的部分——可能你认为你正在立即执行GoogleLoginCallback 方法——但你没有。真正发生的是 GoogleAuthentication Middleware 正在承担这一责任。它标识该请求是 OpenIDConnect 流程的一部分,并将尝试为您获取令牌并在您的上下文中设置身份。
    5. 不幸的是,出现了问题,因为您使用?error=access_denied 参数获得了另一个重定向。这完全由 Katana 项目的 GoogleOAuth2AuthenticationHandler 实现完成:https://github.com/aspnet/AspNetKatana/blob/beb224c88712b08ce45f1d14bb8cf0cd9d4a8503/src/Microsoft.Owin.Security.Google/GoogleOAuth2AuthenticationHandler.cs#L259 这是执行此操作的代码。我认为您应该使用此存储库来识别流程以及可能出现的问题(看起来您的 context.Identitynull 出于某种原因)。
    6. 现在,在该重定向上,您终于执行了您的控制器方法GoogleLoginCallback 但我猜是因为上一步失败 - 我们在该请求中没有正确的身份状态。

      你还没有分享更多的Startup.cs,但你应该使用.UseCookieAuthentication(),如Katana示例https://github.com/aspnet/AspNetKatana/blob/beb224c88712b08ce45f1d14bb8cf0cd9d4a8503/samples/Katana.Sandbox.WebServer/Startup.cs#L83所示

      绝对我认为您需要更改的是您需要更改或删除设置CallbackPath 用于识别OpenID 流程步骤https://github.com/aspnet/AspNetKatana/blob/beb224c88712b08ce45f1d14bb8cf0cd9d4a8503/src/Microsoft.Owin.Security.Google/GoogleOAuth2AuthenticationHandler.cs#L224 的属性。此回调仅用于交换访问令牌,默认值为 /signin-google https://github.com/aspnet/AspNetKatana/blob/dbe159e43e2eee44f315f26268943e8ab5a4f60d/src/Microsoft.Owin.Security.Google/GoogleOAuth2AuthenticationOptions.cs#L28 因此,每次您尝试访问控制器方法时,GoogleAuthenticationHandler 都会启动。

      抱歉,如果这仍然没有帮助。但我认为你应该有足够的资源来慢慢找到你的解决方案。如果您仍然无法识别问题,我建议您将 Katana github 中的类复制到您的项目中,重命名,然后整个流程应该是“可调试的”。

      并回答您的最后一个问题:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      相关资源
      最近更新 更多