代码之家  ›  专栏  ›  技术社区  ›  Sat Thiru

关联失败。在微软。AspNetCore。身份验证。OIDC身份验证期间的RemoteAuthenticationHandler

  •  8
  • Sat Thiru  · 技术社区  · 7 年前

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

    1. 浏览器匿名模式(Chrome)
    2. 应用程序位于Azure Application gateway之后(如果不是,则无需复制)。关闭基于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\u uri使用正确的协议方案。

    代码中的处理

    我试着处理 OnRemoteFailure() 事件,并重定向到“/Home/AuthRedirect”,这是一个等待20秒的anon页面,然后重定向到“/”(主页)。这似乎有时有效,但并不总是有效。我没有主意了。

    解决方法

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

    详细信息

    System.Exception: Correlation failed.
       at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.d__12.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.d__6.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__7.MoveNext()
    

    image

    5 回复  |  直到 3 年前
        1
  •  13
  •   Bruce Holman    5 年前

    我在Chrome中有类似的关联错误,但Safari中没有。。。结果是当SameSite。未使用任何站点。您必须使用https运行自定义站点(甚至本地主机)。这解决了我所有的关联难题。

        2
  •  5
  •   Hrvoje Matic    6 年前

    我也有同样的问题,但我的问题是因为我对auth工作流的理解是错误的。 有两个重要的回调URL,我认为它们有相同的用途。我大错特错了。

    这是在启动中定义的。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
  •  3
  •   Machavity Labib Hussain    6 年前

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

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

    同样,确保 SignedOutCallbackPaths 都是独一无二的。 希望对你有用。

        4
  •  0
  •   Piotr Kątny    3 年前

    我猜您的示例中并非如此,但就在今天更改为冬季时间后,我遇到了相同错误消息的问题-由于某种原因,我的时钟没有自动同步,系统时间仍提前一个小时-在与远程时间服务器同步后,一切又开始工作。我希望有人觉得这很有帮助。

        5
  •  -3
  •   heavenwing    7 年前

    我也有同样的问题,若您的环境是web场,那个么您应该使用DataProtection来共享密钥。