Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法验证OWIN OpenIdConnect中间件IDX10311 nonce_C#_Owin_Fiddler_Identityserver3_Openid Connect - Fatal编程技术网

C# 无法验证OWIN OpenIdConnect中间件IDX10311 nonce

C# 无法验证OWIN OpenIdConnect中间件IDX10311 nonce,c#,owin,fiddler,identityserver3,openid-connect,C#,Owin,Fiddler,Identityserver3,Openid Connect,我有一个使用OWIN中间件的OpenIdConnect应用程序。startup.cs文件使用app.UseOpenIdConnectAuthentication的标准实现。cookie已设置为浏览器,但出现以下错误: IDX10311:Requiremonce为“true”(默认值),但validationContext.Nonce为null。无法验证nonce。如果不需要检查nonce,请将OpenIdConnectProtocolValidator.RequireNonce设置为“false

我有一个使用OWIN中间件的OpenIdConnect应用程序。startup.cs文件使用app.UseOpenIdConnectAuthentication的标准实现。cookie已设置为浏览器,但出现以下错误:

IDX10311:Requiremonce为“true”(默认值),但validationContext.Nonce为null。无法验证nonce。如果不需要检查nonce,请将OpenIdConnectProtocolValidator.RequireNonce设置为“false”

我发现,当运行fiddler时,就像我对大多数调试项目所做的那样,这种行为会发生。返回错误,但如果我返回站点,一切正常,并且我的用户已通过身份验证。有人在运行fiddler时见过这种行为吗

与小提琴手:

  • OpenIdConnect中的SecurityTokenValidated通知执行两次
  • 第二次通过后,抛出IDX10311错误
  • 浏览器包含有效的cookie,返回到我可以查看有效用户身份数据的页面
没有小提琴手的跑步:

  • SecurityTokenValidated在OpenIdConnect中执行一次
  • 未引发错误,继续加载验证后重定向Uri的控制器操作
  • Cookie也有效,并且用户身份数据正确

想法?我不用运行fiddler就可以绕过它,但在调试时,最好也运行fiddler来检查流量。

也许这就是原因

你好,我想我找到了这个问题的根本原因

我在总结我的发现:

  • 问题出在OpenIdConnect.nonce.OpenIdConnect cookie中

  • 一旦OpenID中间件初始化身份验证会话,就会从应用程序(让我们称之为“ID客户端”)设置此cookie

  • 身份验证完成后,应立即将cookie从浏览器发送回“ID客户端”。我的假设是,这个cookie需要从ID客户端的角度进行双重检查(即,我是否真的启动了OpenID Connect授权流?)

  • 我的很多困惑都是由“Nonce”这个术语引起的,它在这个cookie和来自ID服务器的OpenID连接流中都使用

  • 在我的例子中,异常是由于缺少cookie(而不是ID服务器的nonce)引起的,原因很简单,因为浏览器没有将cookie发送回“ID客户端”

  • 在我的例子中,主根是:OpenIdConnect.nonce.OpenIdConnect cookie没有通过浏览器发送回ID客户端。在某些情况下(如Chrome、Firefox和Edge),cookie被正确发送,而在另一些情况下(IE11、Safari),cookie没有被正确发送

    经过大量研究,我发现问题出在浏览器上定义的Cookie限制策略上。在我的例子中,“ID客户机”嵌入在
    中。这会导致“ID客户端”被视为“第三方客户端”,因为用户没有在主窗口中直接导航到该URL。因为这是第三方,对于某些浏览器来说,它的cookie必须被阻止。 实际上,通过设置“阻止第三方cookie”,可以在Chrome上获得相同的效果

    因此,我必须得出结论:

    a) 若iframe是必须的(在我的例子中,因为“ID客户端”是必须在我们的主平台应用程序的图形内容中运行的应用程序),我认为唯一的解决方案是拦截错误,并用页面处理它,要求用户启用第三方cookie

    b) 如果iframe不是必须的,那么在新窗口中打开“ID客户机”就足够了

    希望这能帮上忙,因为我疯了


    Marco

    我知道这是一篇老文章,但我遇到了这个问题,什么都不管用,在我失去了让我的企业应用程序工作的解决方案的想法后,我最终通过在azure中将多租户选项设置为“是”来修复它(在azure中选择:应用程序注册>设置>属性,将多租户设置为“是”,然后单击“保存”)


    希望它能帮助别人,看不到有人提到它。

    我也有同样的问题,但将Microsoft.Owin.Security.OpenIdConnect切换回3.0.1版解决了这个问题

    我在后台运行IIS Express时注意到了这个错误,当时我已切换到以完全IIS托管。当我禁用IIS Express时,我的错误消失了。

    对于我来说,在Azure active directory中更改回复url是可行的

    启用SSL时会发生这种情况,因为它仅将登录URL更改为HTTPS URL,而回复URL保持相同的HTTP URL


    当您尝试使用https URL访问应用程序时,它会在浏览器中设置一个具有唯一编号(nonce)的cookie,并点击Azure AD进行身份验证。身份验证后,浏览器必须授予对该cookie的访问权限。但由于登录URL和回复URL不同,浏览器无法识别您的应用程序,也无法访问该cookie,因此应用程序会抛出此错误。

    web.config中的cookies重写规则可确保samesite cookies出现此神秘异常。禁用该规则解决了这个问题。

    通过Azure Active Directory保护的应用程序的一个临时解决方案是注销(通过转到站点/帐户/注销页面),然后我可以返回主页并正常登录。希望这对某人有帮助。

    我知道这件事已经有一段时间了。我的具体问题是在Fiddler(traffic inspector proxy)运行时与IdentityServer身份验证相关的IDX10311错误。在主机名包含“localhost”的情况下,我添加了一个自定义owin中间件来捕获和吸收IDX13011。忽略此异常允许我们使用带有fiddler的站点作为解决方法。我认为这会导致身份验证过程中断,尽管我们必须在回调上的浏览器地址栏中按enter键才能重新启动,但这只会影响开发

    下面是我们在abs中间件中使用的invoke方法
    public override async Task Invoke(IOwinContext context) {
            try {
                await Next.Invoke(context);
            } catch (Exception ex) {
                _errorHandling = new ErrorHandling();
                if (ex.Message.Contains("IDX10803")) {
                    //do something here to alert your IT staff to a possible IdSvr outage
                    context.Response.Redirect("/Error/IdSvrDown?message=" + ex.Message);
                } else if(ex.Message.Contains("IDX10311") && context.Request.Host.Value.Contains("localhost")) {
                    //absorb exception and allow middleware to continue
                } else {
                    context.Response.Redirect("/Error/OwinMiddlewareError?exMsg=" + ex.Message + "&owinContextName=" + lastMiddlewareTypeName);
                }
            }
        }
    
    app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
                {
                    ClientId = ConfigurationManager.AppSettings["ClientId"].ToString(),
                    Authority = ConfigurationManager.AppSettings["Authority"].ToString(),
                    RedirectUri = ConfigurationManager.AppSettings["RedirectUri"].ToString();//https://www.example.com 
        }
    
      app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
                    {
                        ClientId = ConfigurationManager.AppSettings["ClientId"].ToString(),
                        Authority = ConfigurationManager.AppSettings["Authority"].ToString(),
                        RedirectUri = ConfigurationManager.AppSettings["RedirectUri"].ToString(),//https://www.example.com 
    ,
    
                    // sample how to access token on form (when adding the token response type)
                    Notifications = new OpenIdConnectAuthenticationNotifications
                    {
                        
                        RedirectToIdentityProvider = async n =>
                            {
                                var uri = n.Request.Uri; //From request URL determine the RedirctUri and set below
                                n.ProtocolMessage.RedirectUri =""//Set the url here
                                
                            }
                    }
        }