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

在Asp.Net Web应用程序中使用Okta时,OpenIdConnectProtocolValidationContext.Nonce为null,.net,single-sign-on,owin,okta,samesite,.net,Single Sign On,Owin,Okta,Samesite,我有一个.NETASP.NETWebApplication,我正在尝试使用Okta实现单点登录功能。除了使用Google Chrome 80+登录外,我所有的代码都可以正常工作和运行。当我登录Okta并被调回我的应用程序时,我得到以下错误。以下是我迄今为止尝试过的步骤。这适用于所有其他浏览器,但失败的原因很可能是Chrome 80s SameSite cookie属性的更改 “/”应用程序中出现服务器错误。 IDX21323:要求是“[PII被隐藏]”。 OpenIdConnectProtoco

我有一个.NETASP.NETWebApplication,我正在尝试使用Okta实现单点登录功能。除了使用Google Chrome 80+登录外,我所有的代码都可以正常工作和运行。当我登录Okta并被调回我的应用程序时,我得到以下错误。以下是我迄今为止尝试过的步骤。这适用于所有其他浏览器,但失败的原因很可能是Chrome 80s SameSite cookie属性的更改

“/”应用程序中出现服务器错误。

IDX21323:要求是“[PII被隐藏]”。 OpenIdConnectProtocolValidationContext.Nonce为null, OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce不为null。这个 无法验证nonce。如果不需要检查nonce,请设置 OpenIdConnectProtocolValidator.requireOnce为“false”。注意如果 如果找到“nonce”,将对其进行评估。描述:一个未处理的 执行当前web请求期间发生异常。 请查看堆栈跟踪以了解有关错误和错误的更多信息 它起源于代码的地方

异常详细信息:

Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolInvalidNonceException: IDX21323:要求是“[PII被隐藏]”。 OpenIdConnectProtocolValidationContext.Nonce为null, OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce不为null。这个 无法验证nonce。如果不需要检查nonce,请设置 OpenIdConnectProtocolValidator.requireOnce为“false”。注意如果 如果找到“nonce”,将对其进行评估

源错误:

在执行过程中生成了未处理的异常 当前web请求。关于货物来源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常

堆栈跟踪:

[OpenIDConnectProtocolInValidNoceException:IDX21323:请求已被删除 “[PII是隐藏的]”。OpenIdConnectProtocolValidationContext.Nonce是 null,未指定OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce null。无法验证nonce。如果不需要检查 现在,将OpenIdConnectProtocolValidator.Requirence设置为“false”。 注意:如果找到“nonce”,将对其进行评估。]
Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolValidator.ValidateNonce(OpenIdConnectProtocolValidationContext 验证上下文)+1374
Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolValidator.ValidateAuthenticationResponse(OpenIdConnectProtocolValidationContext validationContext)+219
Microsoft.Owin.Security.OpenIdConnect.d_u11.MoveNext() +3770 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()+27

  • 已将.Net版本升级到4.7.2
  • 将Microsoft.Owin的Nuget软件包升级到4.1
  • 在启动中添加了SameSite配置
  • 添加了web.config值
  • 添加了CookieManager代码
  • Startup.cs
    Configure()代码

    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
    app.UseCookieAuthentication(新的CookieAuthenticationOptions()
    {
    CookieSameSite=SameSiteMode.None,
    CookieSecure=CookieSecureOption。始终,
    CookieHttpOnly=true,
    CookieManager=新代码.SameSiteCookieManager(新的Microsoft.Owin.Host.SystemWeb.SystemWebCookieManager())
    });
    app.UseOktaMvc(新的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=新列表{“openid”、“profile”、“email”},
    });
    Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolValidator dd=新的Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolValidator();
    dd.RequireNonce=false;
    //初始化ADM工具包并开始日志记录。
    Code.KitHelper.Init();
    
    检查您是否仅在Chrome中遇到此问题。如果是这样的话,这将是因为在版本80中启动了新的安全实现

    如果启用,没有SameSite限制的Cookie也必须是安全的。如果没有SameSite限制的cookie设置为没有安全属性,则将拒绝该cookie。此标志仅在同时启用“SameSite by default cookies”时有效Mac、Windows、Linux、Chrome操作系统、Android

    但是,您可以在中禁用此功能chrome://flags 但它现在默认启用

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


    一旦将chrome设置为disabled(禁用),您就必须重新启动chrome。这解决了我的问题,并解释了为什么在生产环境中,每件事情都按预期工作,但在本地,我遇到了暂时错误。

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


    相关线程:

    我也遇到了这个问题,也是突然出现的。自从认证码在6个月前上线以来,我就没有碰过它。奇怪的是,它只影响我本地,一旦部署,它就可以按预期工作。@Brandonm您是将.Net版本升级到4.7.2还是只需将CookieSecure选项设置为Always?是的,事实上我也迁移到了4.7.2,并将关联的OpenIdConnect nuget软件包升级到支持的最新版本。我的所有Cookie身份验证选项都设置为默认值。感谢Brandon,我认为你是对的,我认为我的问题是没有交付nonce Cookie,因为它没有明确设置为安全,这就是chrome 80崩溃的原因。我能够禁用您之前提到的设置,它
    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();