我有一个将 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 来检查流量。
最佳答案
也许是这个原因?
你好,我想我找到了这个问题的根本原因。
我正在总结我的发现:
问题出在 OpenIdConnect.nonce.OpenIdConnect cookie 中
一旦 OpenID 中间件启动身份验证 session ,就会从应用程序(我们称之为“ID 客户端”)设置此 cookie
身份验证完成后,cookie 应立即从浏览器发送回“ID 客户端”。我的假设是,从 ID 客户端的角度来看,需要此 cookie 进行双重检查(即我是否真的启动了 OpenID Connect 授权流程?)
我的很多困惑是由“Nonce”一词引起的,它既用在这个 cookie 中,也用在来自 ID 服务器的 OpenID Connect 流中。
在我的例子中,异常是由丢失的 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/