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

Sat*_*iru 7 c# asp.net-identity openid-connect asp.net-core azure-application-gateway

我使用以下组合来实现这一点: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);
Run Code Online (Sandbox Code Playgroud)

我按照建议将 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(Task task) at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.d__6.MoveNext() --- 从上一个抛出异常的位置开始的堆栈跟踪结束---在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Microsoft.AspNetCore.Builder.RouterMiddleware.d__4。

图片

小智 10

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


Hrv*_*tić 5

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

这在 Startup.cs 中定义

.AddOpenIdConnect("Auth0", options =>
            {
                options.CallbackPath = new PathString("/signin-auth0");
Run Code Online (Sandbox Code Playgroud)

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

在那之后(两天的斗争),一切都开始了。

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


hea*_*ing -3

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

  • 如何添加 DataProtection 中间件? (6认同)