OWIN OpenIdConnect中间件IDX10311随机数无法validation

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

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

我发现当像大多数调试项目一样运行fiddler时,会发生这种情况。 返回错误,但如果我返回该站点,一切正常,我的用户已通过身份validation。 有没有人在运行提琴手时看到这种行为?

随着提琴手:

  • OpenIdConnect中的SecurityTokenValidated通知执行两次。
  • 第二次通过IDX10311后抛出错误
  • 浏览器包含有效的cookie,返回页面我可以查看有效的User.Identity数据。

没有提琴手跑:

  • SecurityTokenValidated在OpenIdConnect中执行一次
  • 没有抛出错误,继续加载控制器操作以进行后validation重定向Uri
  • Cookie也有效且User.Identity数据正确。

想法? 我可以在不运行fiddler的情况下绕过它,但是在调试时也可以运行fiddler来检查流量。

这可能是原因吗?

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

我总结了我的发现:

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

  2. 一旦OpenID中间件启动认证会话,就会从应用程序设置此cookie(让我们称之为“ID客户端”)

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

  4. 我的很多困惑是由“Nonce”术语引起的,在此cookie和ID服务器的OpenID Connect流程中使用。

  5. 在我的情况下,例外是由于缺少cookie(而不是ID Server的nonce),仅仅是因为它没有被浏览器发送回“ID客户端”

因此,在我的情况下,主根是这样的:浏览器没有将OpenIdConnect.nonce.OpenIdConnect cookie发送回ID Client。 在某些情况下(即Chrome,Firefox和Edge)cookie正确发送,而在其他情况下(IE11,Safari)则没有。

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

所以,我必须得出结论:

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

b)如果iframe不是必须的,它应该足以在新窗口中打开“ID Client”。

希望这有助于某人,因为我疯了!

马尔科

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

我知道这是一个旧post,但我遇到了这个问题,没有什么对我有用,在我的企业应用程序工作的解决方案背后失去理智我最终通过在azure色中设置多租户选项来修复它(在Azure中)选择:应用程序注册>设置>属性,将多租户设置为是,然后单击保存)。

希望它可以帮助某人,看不到任何人提及它。

当我在完整的IIS中切换到托管时,我在后台运行IIS Express时发现了这个错误。 当我禁用IIS Express时,我的错误就消失了。

对我来说,更改Azure活动目录中的回复URL是有效的。

启用S​​SL时会发生这种情况,因为它只会将URL的登录URL更改为HTTPS URL,而回复URL仍保持相同的HTTP URL。

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