Chrome 未在我的 OpenID Connect 工作流程 (ASP.NET OWIN) 中保存/返回 Nonce cookie

Sco*_*ell 2 cookies asp.net-mvc owin openid-connect auth0

我正在尝试让 OpenID Connect 身份验证适用于我的旧版 ASP.NET MVC 应用程序。我的 ASP.NET MVC 应用程序将作为中继方,我们的业务合作伙伴将作为身份提供者。

为了熟悉我需要做什么,我在 Auth0 上创建了一个帐户,并为 Web 应用程序创建了一个新的应用程序。然后我从 GitHub 下载了他们的 ASP.NET MVC OWIN 快速入门。我已完成所有设置,并且能够使用 Microsoft Edge 和 Firefox成功进行身份验证。但对于 Chrome,工作流程是这样的:

  1. 访问本地主机:3000
  2. 尝试访问受保护的资源,这会将我重定向到 localhost:3000/Account/Login
  3. /Account/Login 创建质询,它执行两件事:(1) 创建 Nonce cookie,以及 (2) 将用户重定向到 Auth0 的/authorize端点
  4. 我在 Auth0 的登录屏幕上成功登录
  5. /callback向localhost:3000 上的端点发出 POST 请求
  6. 我收到黄屏死机并显示以下消息:

IDX21323:RequireNonce 是“System.Boolean”。OpenIdConnectProtocolValidationContext.Nonce 为 null,OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce 不为 null。无法验证随机数。如果不需要检查随机数,请将 OpenIdConnectProtocolValidator.RequireNonce 设置为“false”。请注意,如果找到“随机数”,则会对其进行评估。

检查 HTTP 流量,我发现Chrome 的问题在于步骤 (3) 中 - 当服务器在 302 重定向中设置 Nonce cookie 时 - Chrome 没有保存它。因此,当步骤(5)发生时,浏览器不会向服务器发送任何Nonce信息,验证失败。

步骤 (3) 和 (5) 中的 HTTP 流量证明了这一点。这是步骤 (3) 中的本地主机响应。您可以看到它告诉浏览器存储 Nonce cookie:

HTTP/1.1 302 Found
Cache-Control: private
Location: https://whatever.us.auth0.com/authorize?client_id=gYb3FOL5OWK419L8...
Set-Cookie: OpenIdConnect.nonce.fRunx5CPoGdhTRM3mgqpn62m9SFkH4AszKWpOOk8LV0%3D=T1NPQjNlYTgtQ...; path=/; expires=Sat, 18-Jul-2020 20:47:59 GMT; HttpOnly; SameSite=None
Run Code Online (Sandbox Code Playgroud)

但是在我重定向到 Auth0 后,我可以检查 Chrome 的 cookie,并且它的 localhost cookie 集合中没有 Nonce cookie。此外,当执行步骤 (5) 时,浏览器请求看起来像这样 - 没有提及 Nonce cookie:

POST http://localhost:3000/callback HTTP/1.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36

code=DANVniZ296OzQW...
Run Code Online (Sandbox Code Playgroud)

这会导致上述错误。

(当我使用 Edge 或 Firefox 检查 HTTP 流量时,在步骤 (5) 中,我看到浏览器发送了 Nonce cookie,而 Chrome 完全丢失了它。)

我使用的是 Chrome 版本 84 和 Windows 10。我还在家里的一台装有 Windows 7(和 Chrome 84)的旧电脑上尝试过此操作,并经历了完全相同的行为。

这里发生了什么,更重要的是,我如何让它工作?我最初的假设是,这可能是 SameSite cookie 问题,但我不认为是这种情况,因为我可以看到 cookie 一开始就没有创建(并不是说它存在,而是不存在)通过重定向发送到本地主机)。而且,Nonce cookie 有SameSite=None,所以这应该不重要,对吧?

谢谢

Sco*_*ell 8

在同事的帮助下解决了...

SameSite=None如果流量通过 HTTP,Chrome 在使用时不会保存 cookie 。需要设置 Visual Studio 以使用 HTTPS。一旦我这样做了,事情就按预期进行了。