【问题标题】:Why is a Cookie not sent to API endpoint on API host machine only?为什么 Cookie 只发送到 API 主机上的 API 端点?
【发布时间】:2019-10-13 10:25:36
【问题描述】:

我的 API 有身份验证端点 A,它应该返回一个身份验证 cookie。端点 B 需要身份验证 cookie。访问端点 A 后,我的开发机器和单独的测试客户端机器在 Chrome 中访问端点 B(在实时 VM 上,不涉及 localhost)时始终成功验证。我可以在对端点 B 的请求中看到 cookie 标头。

同时,当从托管 VM 本身访问活动端点 B 时,身份验证似乎成功,但 Chrome 在尝试访问端点 B 时被重定向。日志记录表明身份验证 cookie 未在请求中发送到端点 B。

在使用 Postman 时,我的开发机器和 VM 都会收到 set-cookie 标头作为响应(我必须在两台机器上禁用 SSL 验证才能正常工作)。

cookie 看起来像这样,虽然我也尝试过没有域、安全和同站点策略(增量):

cName=cValue; expires=Tue, 11 Jun 2019 02:21:06 GMT; domain=.mydomain.net; path=/; secure; samesite=lax

问题:什么会阻止 VM 上的 Chrome 发送 cookie?我已经尝试调整 cookie 的属性以防万一。

上下文

  • asp.net核心版本:2.2
  • Cookie.httpOnly: false
  • Cookie.SameSite:我尝试过 None 和 Lax,因为 cookie 是从 chrome 扩展程序请求的。
  • Cookie.Secure:真假我都试过了。
  • Cookie.Domain:我尝试了多个值,但没有设置。
  • CORS 已使用且完全打开。
  • 我已为该站点安装了受信任的 SSL 证书。

【问题讨论】:

    标签: authentication asp.net-core cookies cors


    【解决方案1】:

    我需要学习一些 CORS 知识来实现​​我的目标。我发现了一个很有帮助的msdn article。简而言之,为了满足浏览器并在服务器上根据需要接受请求,需要进行以下客户端和服务器更改。

    这导致了我的直接问题:

    • 必须在客户端将 XMLHttpRequest.withCredentials 设置为 true,以免忽略响应 (paragraph 2) 中的身份验证 cookie。
    • 必须在 Startup.cs 的 Configure() 中调用 CorsPolicyBuilder.AllowCredentials() 才能接收 withCredentials 请求。

    奇怪的是,没有它,它在除托管服务器之外的任何地方都可以正常工作,我仍然无法解释。

    我需要纠正的其他讨厌的细节可能会使问题蒙上阴影:

    • 必须根据用例适当设置 Cookie 的域
    • Cookie 的 SameSite 属性必须是 Lax
    • UseCors()
    • CorsPolicyBuilder.WithOrigins(new string[] {"domain-a","domain-b"})

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 2015-04-06
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      相关资源
      最近更新 更多