我有一个 .Net Asp.Net WebApplication,我正在尝试使用 Okta 实现单点登录功能。除了使用 Google Chrome 80+ 登录之外,我的所有代码都在正常工作和运行。当我登录 Okta 并被回调到我的应用程序时,我收到以下错误。以下是我迄今为止尝试过的步骤。这适用于所有其他浏览器,但很可能由于 Chrome 80 年代的 SameSite cookie 属性更改而失败。
“/”应用程序中的服务器错误。
IDX21323:RequireNonce 是“[PII 已隐藏]”。 OpenIdConnectProtocolValidationContext.Nonce 为空, OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce 不为空。这 无法验证随机数。如果不需要检查nonce,则设置 OpenIdConnectProtocolValidator.RequireNonce 为“false”。请注意,如果 找到“nonce”将对其进行评估。描述:未处理 执行当前 Web 请求期间发生异常。 请查看堆栈跟踪以获取有关错误和的更多信息 它起源于代码。
异常详细信息:
Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolInvalidNonceException: IDX21323:RequireNonce 为“[PII 已隐藏]”。 OpenIdConnectProtocolValidationContext.Nonce 为空, OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce 不为空。这 无法验证随机数。如果不需要检查nonce,则设置 OpenIdConnectProtocolValidator.RequireNonce 为“false”。请注意,如果 找到“nonce”将对其进行评估。
来源错误:
执行过程中产生了未处理的异常 当前的网络请求。有关原产地和地点的信息 可以使用下面的异常堆栈跟踪来识别异常。
堆栈跟踪:
[OpenIdConnectProtocolInvalidNonceException:IDX21323:RequireNonce 是 “[PII 已隐藏]”。 OpenIdConnectProtocolValidationContext.Nonce 是 null,OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce 不是 无效的。无法验证随机数。如果您不需要检查 nonce,将 OpenIdConnectProtocolValidator.RequireNonce 设置为“false”。 请注意,如果找到“随机数”,则会对其进行评估。]
Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolValidator.ValidateNonce(OpenIdConnectProtocolValidationContext 验证上下文)+1374
Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolValidator.ValidateAuthenticationResponse(OpenIdConnectProtocolValidationContext 验证上下文)+219
Microsoft.Owin.Security.OpenIdConnect.d__11.MoveNext() +3770 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +27
Startup.cs
配置()代码
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
CookieSameSite = SameSiteMode.None,
CookieSecure = CookieSecureOption.Always,
CookieHttpOnly = true,
CookieManager = new Code.SameSiteCookieManager(new Microsoft.Owin.Host.SystemWeb.SystemWebCookieManager())
});
app.UseOktaMvc(new OktaMvcOptions()
{
OktaDomain = ConfigurationManager.AppSettings["okta:OktaDomain"],
ClientId = ConfigurationManager.AppSettings["okta:ClientId"],
ClientSecret = ConfigurationManager.AppSettings["okta:ClientSecret"],
RedirectUri = ConfigurationManager.AppSettings["okta:RedirectUri"],
PostLogoutRedirectUri = ConfigurationManager.AppSettings["okta:PostLogoutRedirectUri"],
AuthorizationServerId = string.Empty,
Scope = new List<string> { "openid", "profile", "email" },
});
Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolValidator dd = new Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolValidator();
dd.RequireNonce = false;
//Init ADM Kit and start logging.
Code.KitHelper.Init();
检查您是否仅在 Chrome 中遇到此问题。如果是这样,这可能是因为版本 80 中推出了新的安全实现。
如果启用,没有 SameSite 限制的 cookie 也必须是安全的。如果没有设置 Secure 属性,则没有 SameSite 限制的 cookie 将被拒绝。仅当“SameSite by default cookies”也启用时,此标志才有效。 – Mac、Windows、Linux、Chrome 操作系统、Android
但是,您可以在 chrome://flags 中禁用此功能,但现在默认情况下启用
#cookies-没有相同站点必须安全
一旦将其设置为禁用,您就必须重新启动 chrome。这解决了我的问题并解释了为什么在生产中一切都按预期工作,但在本地我收到了随机数错误。
我想补充一点,您可以检查您的项目或环境(如负载均衡器)中是否存在通过 http 而不是 https 进行通信的配置。
我也面临同样的问题,您能否分享您为使其正常工作而创建的 web.config 值