【问题标题】:Correlation failed. at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler during OIDC authentication关联失败。在 OIDC 身份验证期间的 Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler
【发布时间】:2018-10-11 23:09:08
【问题描述】:

我使用以下组合来实现这一点:

  1. 浏览器隐身模式 (Chrome)
  2. 应用程序位于 Azure 应用程序网关后面(如果不是,则没有复制)。基于 Cookie 的亲和力关闭(默认);如果打开,似乎会使重现更频繁。

代码是相当普通的 OIDC authN + cookie。

        services.AddAuthentication(options =>
        {
            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        })
        .AddAzureAd(options => {
            Configuration.Bind("AzureAd", options);
        })
        .AddCookie(p => p.SlidingExpiration = true);

我按照建议将 X-Forwarded-Proto 标头转发到 auth 中间件,因此 redirect_uri 使用正确的协议方案。

代码处理

我尝试处理 OnRemoteFailure() 事件,并重定向到“/Home/AuthRedirect”,这是一个等待 20 秒的匿名页面,然后重定向到“/”(主页页)。它有时似乎有效,但并非总是如此。我没有想法。

解决方法

  1. 用户可以再次进入主页并按 F5 直到此操作生效。似乎每个 F5 都让他们向前迈进了一步,一旦填充了 OpenID cookie,其他一切(openid 完成后我有更多的身份验证,通过 adal.js 用于 AJAX)。
  2. 绕过应用程序网关并使用直接服务结构集群 DNS 名称(不可接受,因为它是 http)。

详情

System.Exception:关联失败。 在 Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.d__12.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.d__6.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__7.MoveNext()

【问题讨论】:

  • 我想知道这是否与 Chrome 调试器中的 Expires/MaxAge 时间总是显示 1969-12-31 有关。这意味着我的 cookie 是会话 cookie,但我无法让它们持久化。
  • 我让他们坚持不懈。对这个问题没有影响。

标签: c# asp.net-core asp.net-identity openid-connect azure-application-gateway


【解决方案1】:

我在 Chrome 中遇到了类似的相关错误,但在 Safari 中没有……事实证明,当使用 SameSite.None 时,您必须使用 https 运行您的自定义站点(甚至是本地主机)。这解决了我所有的相关问题。

【讨论】:

    【解决方案2】:

    我有同样的问题,但我的问题是由于我对身份验证工作流程的理解,这是错误的。 有两个重要的回调 URL,我认为它们具有相同的目的。我错了。

    这是在 Startup.cs 中定义的

    .AddOpenIdConnect("Auth0", options =>
                {
                    options.CallbackPath = new PathString("/signin-auth0");
    

    它告诉应用程序中的授权中间件,一旦身份验证提供程序在成功验证后返回,它应该监听哪个 URL。 然后中间件本身会将应用程序重定向到您的登录操作中定义的回调 URL(示例代码如下)。

    在那之后(两天的奋斗),一切都开始起作用了。

    public class AccountController : Controller
    {
        [HttpGet]
        public async Task Login()
        {
            await HttpContext.ChallengeAsync("Auth0", new AuthenticationProperties() { RedirectUri = "/my-callback-page" });
        }
    }
    

    【讨论】:

      【解决方案3】:

      我有同样的问题。我正在为授权定义多个外部端点。 在我的例子中,我定义了多个客户端正在使用的回调路径。 一旦我定义了唯一的回调路径,问题就解决了: 示例:

        options.Authority = …..";
      .
      .
        options.CallbackPath = "/signin-idsrv2"; // I already had /sign-in-idsrv
      

      同样,确保SignedOutCallbackPaths 是唯一的。 希望它对你有用。

      【讨论】:

        【解决方案4】:

        我想在您的示例中不是这种情况,但是今天在更改冬季时间后,我遇到了同样的错误消息 - 我的时钟由于某种原因没有自动同步,系统时间仍然提前一小时 -与远程时间服务器同步后,一切又开始工作了。我希望有人觉得这很有帮助。

        【讨论】:

          【解决方案5】:

          我也有同样的问题,如果你的环境是网络农场,你应该使用 DataProtection 来共享密钥。

          【讨论】:

          • 你能详细说明一下吗?在这种情况下,“使用 DataProtection 共享密钥”是什么意思?
          • 其实我现在明白了。一旦我添加了 DataProtection 中间件,问题就不再是重现了。这是我的解释:对 AD 的 GET 调用发生在与处理 POST /signin-oidc 请求的节点不同的节点上;因为 cookie 的加密/解密密钥(我相信是随机数)在节点之间是不同的(由于缺少 DataProtection 中间件),所以解密失败,因此出现“相关失败”错误。我使用 .AddDataProtection() 并使用 blob 存储容器来托管密钥 xml。不再重现“关联失败”错误。
          • 如何添加 DataProtection 中间件?
          • @BlackFox in StartUp.cs 文件 --> ConfigureServices 方法 --> 输入:“services.AddDataProtection();”
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-27
          • 2014-01-24
          相关资源
          最近更新 更多