相关失败。在OIDC身份验证期间的Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler

时间:2018-05-01 22:04:43

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

我用以下组合点击这个: 1)浏览器隐身模式(Chrome) 2)应用程序位于Azure应用程序网关之后(如果不是,则不进行repro)。基于Cookie的亲和关闭(默认);如果打开,似乎会更频繁地发生再现。

代码相当普通的OIDC authN + cookies。

        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完成后有更多auth,通过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()

image

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

我遇到同样的问题,如果你的环境是web farm,你应该使用DataProtection来共享密钥。

答案 2 :(得分:1)

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

_

类似地,确保 options.Authority = ….."; . . options.CallbackPath = "/signin-idsrv2"; // I already had /sign-in-idsrv 是唯一的。 希望它对您有用。

答案 3 :(得分:0)

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

这在Startup.cs中定义

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

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

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

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