ASP.Net Core-OAuth令牌端点失败:状态:BadRequest

时间:2019-03-03 09:56:05

标签: asp.net asp.net-core oauth oauth-2.0 core

使用针对Google的ASP.Net Core身份验证时,我正在执行以下方案:

  1. 单击以通过Google登录。
  2. 成功登录Google。此时,我返回了我的应用程序,并且能够继续进行我的with流程。用户声明已按预期退回。
  3. 立即返回步骤1,然后尝试使用相同的帐户再次通过Google登录。如果出现Google提示,请选择相同的帐户/再次输入凭据。
  4. 这时我现在收到以下错误。

如果我等待一段时间(也许是30分钟),如果我再次从步骤1开始,则直到再次到达步骤4时,我才遇到问题。如果为核心项目重新启动IIS ApplicationPool,则可以请按照上述步骤1起作用的情况进行操作,但随后步骤4会显示此问题。

我无休止地搜索了无限在线的感觉。有谁能提供建议吗?为什么这会第一次起作用,然后在第二次,第三次尝试中失败?

在我的Google Pixel 3 XL手机上按照上述方案进行操作时,我收到以下错误消息:

  

System.Exception:   SocialLoginController |错误| OAuth   令牌端点失败:状态:BadRequest;标头:变化:X-Origin,   Referer,Origin,Accept-Encoding Date:Sun,03 Mar 2019 09:35:45 GMT     服务器:ESF缓存控制:专用X-XSS保护:1;模式=阻止     X框架选项:SAMEORIGIN X内容类型选项:nosniff     Alt-Svc:quic =“:443”; ma = 2592000; v =“ 44,43,39”接受范围:无     传输编码:分块;正文:{“错误”:“ invalid_grant”,
  “ error_description”:“错误请求”};

我的Startup.cs类中用于Google身份验证的代码如下:

        services.AddAuthentication(options =>
        {
            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        })
        .AddCookie(options =>
        {
            options.LoginPath = "/login";
            options.LogoutPath = "/signout";
        });

services.AddAuthentication().AddGoogle(socialProvider.ProviderName, o =>
{
    o.ClientId = [REMOVED]
    o.ClientSecret = [REMOVED]
    o.UserInformationEndpoint = "https://www.googleapis.com/oauth2/v2/userinfo";
    o.ClaimActions.Clear();
    o.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "id");
    o.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
    o.ClaimActions.MapJsonKey(ClaimTypes.GivenName, "given_name");
    o.ClaimActions.MapJsonKey(ClaimTypes.Surname, "family_name");
    o.ClaimActions.MapJsonKey("urn:google:profile", "link");
    o.ClaimActions.MapJsonKey(ClaimTypes.Email, "email");
    o.CallbackPath = string.Format("/signin-{0}", socialProvider.ProviderName.ToLower());
    o.SaveTokens = true;
    o.Events.OnRemoteFailure = ctx =>
    {
        string message = UrlEncoder.Default.Encode(ctx.Failure.Message);
        if (!string.IsNullOrEmpty(message) && message.Length > 1500)
        {
            message = message.Substring(0, 1499);
        }
        ctx.Response.Redirect(errorRedirectUrl + message);
        ctx.HandleResponse();
        return Task.FromResult(0);
    };
});


services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

也请参见下面的图片,其中显示了启用“ UseDeveloperExceptionPage”时的错误。

The error shown when UseDeveloperExceptionPage is enabled.

仅供参考,我完全无法在iPhone和台式机上复制该问题-我从未收到该问题,并且可以尝试进行任意多次登录尝试,这些设备上似乎从未出现该问题。

我迷路了!

1 个答案:

答案 0 :(得分:0)

我能够在这里识别出我的问题,该问题对于我发现的其他任何答案都是唯一的,但与我遇到的上述错误相同。

问题:在我的Pixel设备上,我有一个应用程序(My-App)可以在我在Chrome浏览器中访问的同一域上运行。单击以通过Google登录时,我记得它曾经问过我要“在Chrome中打开”还是“在我的应用程序中打开”,并且我始终选择“在Chrome中打开”。

我卸载了My-App,现在无法复制该问题。问题不见了。每当它工作时,我多次尝试该方案都无济于事!当我重新安装My-App时,问题又回来了。

修复::我需要解决的问题是,我的Core项目正在运行My-App的域之外的其他域中运行,因此设备上不会出现关于Chrome应该打开还是My-App应该打开。希望这将是我的解决办法!

感谢您的阅读。