首页 > 解决方案 > IDX21323:RequireNonce 是“[PII 已隐藏]”。OpenIdConnectProtocolValidationContext.Nonce 为空,ValidatedIdToken.Payload.Nonce 不为空

问题描述

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

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

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

提前致谢!

标签: asp.net-mvcidentityserver4openid-connectnonce

解决方案


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

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

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


推荐阅读