【问题标题】:Aspnetcore authentication Correlation failedAspnetcore 身份验证关联失败
【发布时间】:2018-11-17 16:04:03
【问题描述】:

我搜索了不同的 SO 答案和 GIT 上的 Aspnetcore 身份验证,但没有一个解决方案有帮助。我遇到了“关联失败”的问题,原因是关联 cookie 未设置,即使它明确位于重定向到 Google 的响应标头中。 enter image description here

这是 Fiddler 中的响应:

HTTP/1.1 302 找到 地点:https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=996823962179-1vvr5h2icjroveset9849e8aqdks1g66.apps.googleusercontent.com&redirect_uri=https%3A%2F%2Flocalhost%2Fsignin-google&scope=openid%20profile%20email&state=CfDJ8EGRdEf8M7VDtyNKY6R10TxxM2kHFoDlOBkCQKoMQJXX3QPKcyH8quz80oy8Wd7Rq1Nnb-KhklzrC-XK4WOhikAVtJuFHIk_M4ZvLY8Le2FkjVNxJrHDsZeg7o1sMrABd_md1jxi-LelhURiB54SUAHbaJciseDc5NP897CSsrtYoPt_IWyqNOdxCjPntxwHYUzO2ZxIcfSLaLGu8rWlfHTEqvj_N7KQ0k8HQ8VwPYDXjAMwjjsGRdxR6dOl-vNfzfOqX0wZelvVsX5UIfzMjlCJ20lQxLIhlkhkpne14EYYNkJufqF4ZADD13jvsj4qnw 服务器:红隼 设置 Cookie:.AspNetCore.Correlation.Google.WKzW6d​​i96f3Fbh4ThkfIFHteUvNLusesaT0VjAMhrDU=N; expires=2018 年 11 月 17 日星期六 16:14:20 GMT;路径=/登录-谷歌;安全的;同站点=严格; httponly 设置 Cookie:.AspNetCore.Mvc.CookieTempDataProvider=;到期=格林威治标准时间 1970 年 1 月 1 日星期四 00:00:00;路径=/;安全的;同站点=严格; httponly 日期:格林威治标准时间 2018 年 12 月 28 日星期五 03:45:54 内容长度:0

我已将数据保护设置为将密钥存储到一个位置,并且按预期工作。我的源代码控制在这里: https://github.com/jjkesinger/charts/tree/master/Charts

有什么想法吗?本地机器上的 TLS 和它有什么关系吗?我可以将此项目克隆到另一台机器上,它工作正常。它不工作的机器是 Windows 10 dell experion

【问题讨论】:

  • 还下载了示例github.com/aspnet/Security 并得到关联失败错误。相同的行为 - 即使 302 到 google/fb/git 等的标头说 set-header,也不会保留相关 cookie
  • 您是否尝试过重置所有浏览器设置? (我的意思是整个交易)。和/或尝试不同的浏览器。无意中更改某些可能导致此问题的设置非常容易。我最近遇到了类似的情况(在我为 localhost 开发启用 https 支持后,chrome 陷入了无限循环),并重置了浏览器设置(所有设置,除了历史缓存;以及过去的所有时间)“修复”了它。
  • 最终我的 cookie 政策设置为严格。改为松散,它的工作原理。
  • 是的,samesite=strict 与 OAuth 不兼容。

标签: asp.net-core


【解决方案1】:

我也遇到了这个问题,必须设置以下选项:

services.AddAuthentication().AddGoogle(g => 
{
   g.ClientId = XXXXXXX;
   g.ClientSecret = XXXXXX;
   g.CorrelationCookie.SameSite = SameSiteMode.Lax
}

最后一行解决了我的问题。

【讨论】:

    【解决方案2】:

    我已经解决了这个问题一个多星期,终于在 Auth0 帮助台上从 Tanver 那里得到了解决方案。 SameSite.None 要求您run your web server (even localhost) via https。解决了我的问题!

    【讨论】:

    • 欢迎来到 Stack Overflow!虽然这在理论上可以回答这个问题,it would be preferable 在这里包括答案的基本部分,并提供参考链接。
    【解决方案3】:

    SamesiteMode.Lax 不会立即让您登录

    您需要使用此代码:

        .AddGoogle(o =>
        {
            o.ClientId = _configuration.GetValue<string>("ClientId");
            o.ClientSecret = _configuration.GetValue<string>("ClientSecret");
            o.SignInScheme = IdentityConstants.ExternalScheme;
            o.CorrelationCookie.SameSite = SameSiteMode.Unspecified;
        }) 
    

    它有效!

    【讨论】:

      【解决方案4】:

      虽然在您的情况下,真正的问题是您的 cookie 策略为 samesite=strict,但此错误通常意味着在身份提供者的应用注册中定义的 REDIRECT_URI 确实与options.CallbackPath 中提供的值不相关(不匹配)。

      我认为他们说“相关”而不是“匹配”,因为它不必是相同的字符串。在下面的示例中,我仅提供 /signin-microsoft,因为这与 http://localhost:5000/signin-microsofthttps://production-domain-name/app-path.../signin-microsoft 相关,这两者都在 Azure 上的应用注册中定义。

      .AddMicrosoftAccount(microsoftOptions =>
      {
          microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
          microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
          // SET THIS TO CORRELATE WITH REDIRECT_URI THAT YOU  
          // DEFINED IN THE APP REGISTRATION AT THE APP PROVIDER
          microsoftOptions.CallbackPath = "/signin-microsoft"; 
      })
      

      尽管在技术上是合理的,但这是一个非常无用的异常消息。他们没有理由不说WRONG CALLBACK PATH Provider did not call back on the path specified in options.CallbackPath Ensure REDIRECT_URI in app registration at provider correlates to the value supplied in options.CallbackPath

      没有一个样本指定回调路径,因此很可能很多人根本不会提供回调路径(也导致了这个问题)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-11
        • 2014-01-24
        • 2017-11-27
        • 1970-01-01
        • 2016-09-20
        • 1970-01-01
        相关资源
        最近更新 更多