IDX21323:RequireNonce 是“[隐藏 PII]” OpenIdConnectProtocolValidationContext.Nonce 为空,ValidatedIdToken.Payload.Nonce 不为空

问题描述

我有一个 Assp.NET MVC Web 应用程序 MyWebApp,它不允许匿名访问任何页面。配置了一个 IdentityServer4,一旦用户尝试打开 MyWebApp,他就会被重定向到 IdentityServer 登录页面。 (混合流) 用户登录并在 IdentityServer 登录页面停留的时间足够长,因此 Nonce 上的 MyWebApp cookie 会过期(认生命周期为 15 分钟)。 如果他随后在 IdentityServer 中继续登录(成功)并被重定向MyWebApp,则会收到以下错误

Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolInvalidNonceException IDX21323:RequireNonce 是“[隐藏 PII]”。 OpenIdConnectProtocolValidationContext.Nonce 为空, OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce 不为空。这 nonce 无法验证。如果您不需要检查随机数,请设置 OpenIdConnectProtocolValidator.RequireNonce 为“假”。注意如果一个 'nonce' 被发现,它将被评估。

但由于用户在 IdentityServer 中成功通过身份验证,当他再次尝试访问 MyWebApp 时,他被重定向IdentityServer 并返回到 MyWebApp,而无需再次输入用户名/密码.然而,最初的错误很烦人。当“登录”流程开始并且用户“AFK”时间足够长以至于“Nonce”cookie过期并且他无法完成最终验证时,有人遇到过这样的问题吗?处理这种情况的好方法是什么?

提前致谢!

解决方法

在 OpenIdConnectAuthenticationNotifications 中,您可以捕获错误并继续执行下一个中间件:

AuthenticationFailed = (context) =>
                {
                    if (context.Exception.Message.Contains("IDX21323"))
                    {
                        context.SkipToNextMiddleware();
                        return Task.FromResult(0);
                    }
                    return Task.FromResult(0);

如果我记得的话,IDS3 需要一个随机数,而 IDS4 不需要