微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Asp.Net Web应用程序中使用Okta时,OpenIdConnectProtocolValidationContext.Nonce为null

如何解决在Asp.Net Web应用程序中使用Okta时,OpenIdConnectProtocolValidationContext.Nonce为null

我有一个.Net Asp.Net WebApplication,我试图将Okta用于单点登录功能。除了使用Google Chrome 80+进行登录之外,我所有的代码都可以正常运行。当我登录Okta并被调用回我的应用程序时,出现以下错误。以下是到目前为止我尝试过的步骤。该功能可在所有其他浏览器中使用,但很可能由于Chrome 80年代SameSite Cookie属性更改而失败。

“ /”应用程序中的服务器错误 IDX21323:RequireNonce为“ [PII隐藏]”。 OpenIdConnectProtocolValidationContext.Nonce为空,OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce不为空。随机数无法验证。如果不需要检查随机数,请将OpenIdConnectProtocolValidator.RequireNonce设置为'false'。请注意,如果找到一个“ nonce”,它将被评估。 说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。

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

错误:在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来标识有关异常的来源和位置的信息。

堆栈跟踪: [OpenIdConnectProtocolInvalidNonceException:IDX21323:RequireNonce为'[PII被隐藏]'。 OpenIdConnectProtocolValidationContext.Nonce为空,OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce不为空。随机数无法验证。如果不需要检查随机数,请将OpenIdConnectProtocolValidator.RequireNonce设置为'false'。请注意,如果找到“ nonce”,将对其进行评估。] Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolValidator.ValidateNonce(OpenIdConnectProtocolValidationContext validateContext)+1374 Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolValidator.ValidateAuthenticationResponse(OpenIdConnectProtocolValidationContext validateContext)+219 Microsoft.Owin.Security.OpenIdConnect.d__11.MoveNext()+3770 System.Runtime.ExceptionServices.ExceptiondispatchInfo.Throw()+27

  1. .Net版本升级到4.7.2
  2. 将Microsoft.Owin的Nuget软件包升级到4.1
  3. 在启动时添加了SameSite配置
  4. 添加了web.config
  5. 添加了CookieManager代码

Startup.cs Configure()代码

        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也必须是安全的。如果设置的没有SameSite限制的cookie没有设置Secure属性,它将被拒绝。仅当还启用了“默认情况下,SameSite Cookies”时,此标志才有效。 – Mac,Windows,Linux,Chrome操作系统,Android

不过,您可以在chrome:// flags中禁用此功能,但默认情况下已启用

#没有相同站点的cookie必须安全

将chrome设置为禁用后,您必须重新启动chrome。这解决了我的问题,并解释了为什么在生产中每件事都能按预期运行,但在本地却出现随机数错误。

,

我想补充一点,您可以检查项目或环境中是否存在通过http(而非https)进行通信的配置(例如负载平衡器)。

相关主题:https://github.com/okta/okta-aspnet/issues/131

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。