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

标签 c# owin fiddler identityserver3 openid-connect

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

IDX10311: RequireNonce is 'true' (default) but validationContext.Nonce is null. A nonce cannot be validated. If you don't need to check the nonce, set OpenIdConnectProtocolValidator.RequireNonce to 'false'.

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

使用 fiddler :

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

在没有 fiddler 的情况下运行:

  • SecurityTokenValidated 在 OpenIdConnect 中执行一次
  • 没有抛出错误,继续为认证后重定向 Uri 加载 Controller 操作
  • Cookie 也有效且 User.Identity 数据正确。

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

最佳答案

也许是这个原因?

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

我正在总结我的发现:

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

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

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

  4. 我的很多困惑是由“Nonce”一词引起的,它既用在这个 cookie 中,也用在来自 ID 服务器的 OpenID Connect 流中。

  5. 在我的例子中,异常是由丢失的 cookie(不是 ID 服务器的随机数)引起的,只是因为浏览器没有将它发送回“ID 客户端”

因此,在我的例子中,主要根是:浏览器未将 OpenIdConnect.nonce.OpenIdConnect cookie 发送回 ID 客户端。在某些情况下(即 Chrome、Firefox 和 Edge)cookie 被正确发送,而在其他情况下(IE11、Safari)则不是。

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

所以,我必须得出结论:

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

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

希望这对某人有所帮助,因为我疯了!

马可

关于c# - 无法验证 OWIN OpenIdConnect 中间件 IDX10311 nonce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39412570/

相关文章:

c# - 第三方使用的 Azure 函数 REST API - 是否需要使用 ConfigureAwait(false)?

c# - Singleton 上的 StackOverflowException

c# - 找到右键单击 c# White/TestStack UI Automation 的选项

c# - 捕捉 System.Exception 总是不好的做法吗?

authentication - 通过代码使用 SSO 在多台机器上授权 WebAPI

algorithm - 使用 Kentor Saml2 库时出现 "The signing algorithm <...> is weaker than the minimum accepted <...>"错误

azure - TokenCache.BeforeAccess 上的 HttpContext.Current 为 null

Java Applet、Internet Explorer 和 Fiddler

WCF 调用未在 Fiddler2 中显示

ajax - 超时期间的 fiddler 行为