.net - 在 Asp.Net Web 应用程序中使用 Okta 时,OpenIdConnectProtocolValidationContext.Nonce 为空
问题描述
我有一个 .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”,它将被评估。
源错误:
在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。
堆栈跟踪:
[OpenIdConnectProtocolInvalidNonceException:IDX21323:RequireNonce 是“[PII 被隐藏]”。OpenIdConnectProtocolValidationContext.Nonce 为空,OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce 不为空。无法验证随机数。如果您不需要检查 nonce,请将 OpenIdConnectProtocolValidator.RequireNonce 设置为“false”。请注意,如果找到“随机数”,它将被评估。]
Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolValidator.ValidateNonce(OpenIdConnectProtocolValidationContext validationContext) +1374
Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolValidator.ValidateAuthenticationResponse(OpenIdConnectProtocolValidationContext validationContext) +219
Microsoft.Owin.Security.OpenIdConnect.d__11.MoveNext() +3770 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +27
- 将 .Net 版本升级到 4.7.2
- 将 Microsoft.Owin 的 Nuget 包升级到 4.1
- 在启动时添加了 SameSite 配置
- 添加了 web.config 值
- 添加了 CookieManager 代码
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-without-same-site-must-be-secure
将其设置为禁用后,您必须重新启动 chrome。这解决了我的问题并解释了为什么在生产中每件事都按预期工作,但在本地我遇到了 nonce 错误。
推荐阅读
- javascript - getElementById 在类方法中不起作用
- php - Laravel 从 Helper 类重定向
- python - 不知道如何从 CircuitPython 中的两个 JSON 数据源中提取数据
- binance - 如何使用 TALib 查找 RSI6 值
- excel - 绞尽脑汁试图替换公式中的子字符串而不替换稍大的子字符串?
- azure - 超出最大事件中心接收器。每个分区只允许 5 个接收器
- c# - 让用户不关注硒
- c# - 我应该如何在特定的 SharePoint 网站上使用 MS Graph API 进行搜索?
- jsf - PrimeFaces 主题标题标签不适用于特定页面
- matplotlib - Matplotlib 次要网格线不完整