Chrome 未在我的 OpenID Connect 工作流程 (ASP.NET OWIN) 中保存/返回 Nonce cookie
Posted
技术标签:
【中文标题】Chrome 未在我的 OpenID Connect 工作流程 (ASP.NET OWIN) 中保存/返回 Nonce cookie【英文标题】:Chrome is not saving/returning the Nonce cookie in my OpenID Connect workflow (ASP.NET OWIN) 【发布时间】:2020-11-08 11:22:47 【问题描述】:我正在尝试让 OpenID Connect 身份验证适用于我的旧版 ASP.NET MVC 应用程序。我的 ASP.NET MVC 应用程序将作为中继方,我们的业务合作伙伴将作为身份提供者。
为了熟悉我需要做什么,我在 Auth0 上创建了一个帐户,并为 Web 应用程序创建了一个新应用程序。然后我下载了他们的ASP.NET MVC OWIN quickstart from GitHub。我已完成所有设置,并且能够使用 Microsoft Edge 和 Firefox 成功进行身份验证。但是对于 Chrome,工作流程是这样的:
-
访问 localhost:3000
尝试访问受保护的资源,这会将我重定向到 localhost:3000/Account/Login
/Account/Login 创建挑战,它做了两件事:(1) 创建 Nonce cookie,以及 (2) 将用户重定向到 Auth0 的
/authorize
端点
我在 Auth0 的登录屏幕上成功登录
向 localhost:3000 上的 /callback
端点发出 POST 请求
我收到带有以下消息的黄屏死机:
IDX21323:RequireNonce 是“System.Boolean”。 OpenIdConnectProtocolValidationContext.Nonce 为空,OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce 不为空。无法验证随机数。如果您不需要检查 nonce,请将 OpenIdConnectProtocolValidator.RequireNonce 设置为“false”。请注意,如果找到“nonce”,则会对其进行评估。
检查 HTTP 流量我发现 Chrome 的问题在于步骤 (3) - 当服务器在 302 重定向中设置 Nonce cookie 时 - Chrome 不是 保存它。因此,当步骤(5)发生时,浏览器不会向服务器发送任何 Nonce 信息,验证失败。
步骤 (3) 和 (5) 的 HTTP 流量证明了这一点。这是步骤 (3) 上的 localhost 响应。你可以看到它告诉浏览器存储 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
但是在我被重定向到 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...
这会导致上述错误。
(当我使用 Edge 或 Firefox 检查 HTTP 流量时,在步骤 (5) 中,我看到浏览器发送了 Nonce cookie,而 Chrome 完全没有它。)
我使用的是 Chrome 版本 84 和 Windows 10。我还在家里的一台装有 Windows 7(和 Chrome 84)的旧计算机上进行了尝试,并遇到了完全相同的行为。
这里发生了什么,更重要的是,我如何让它发挥作用?我最初的假设是,这可能是 SameSite cookie 问题,但我认为情况并非如此,因为我可以看到 cookie 不是一开始就创建的(不是它存在,而是不存在通过重定向发送到本地主机)。此外,Nonce cookie 有SameSite=None
,所以这应该没关系,对吧?
谢谢
【问题讨论】:
【参考方案1】:在同事的帮助下想通了...
如果流量通过 HTTP,Chrome 在使用 SameSite=None
时不会保存 cookie。需要设置 Visual Studio 以使用 HTTPS。一旦我这样做了,事情就会按预期进行。
【讨论】:
以上是关于Chrome 未在我的 OpenID Connect 工作流程 (ASP.NET OWIN) 中保存/返回 Nonce cookie的主要内容,如果未能解决你的问题,请参考以下文章