8

我用以下组合来解决这个问题:

  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()

图片

4

5 回答 5

13

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

于 2020-03-31T15:51:54.867 回答
5

我有同样的问题,但我的问题是由于我对身份验证工作流程的理解,这是错误的。有两个重要的回调 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" });
    }
}
于 2019-02-15T08:54:53.043 回答
3

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

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

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

于 2018-06-23T01:02:14.167 回答
0

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

于 2021-11-01T20:28:19.673 回答
-3

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

于 2018-05-29T07:06:26.377 回答