【问题标题】:Cookies in Set-Cookie are being ignored by browserSet-Cookie 中的 Cookie 被浏览器忽略
【发布时间】:2021-01-26 05:37:57
【问题描述】:

我确实在设置 cookie 时遇到了问题。我在 Azure Functions 上运行一个小型应用程序,并将一个静态网页作为前端,在登录请求中,我的函数在响应中正确返回了一个 cookie。这是来自我的 Azure 函数的整套响应标头。

HTTP/1.1 200 OK
Date: Sun, 11 Oct 2020 20:40:16 GMT
Content-Type: application/json; charset=utf-8
Server: Kestrel
Content-Length: 180
Set-Cookie: RefreshToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VyTmFtZSI6IlNvc3NlbmJpbmRlciIsImV4cCI6IjYzNzM4MDQ2NTE3MTM3NjE4NCJ9.CCv3a41iPut4eC9jK2eqAzOLP5tWLjMlRgduSkUpS40; expires=Mon, 11 Oct 2021 20:40:17 GMT; path=/; samesite=lax
Set-Cookie: Test=Val; path=/
Access-Control-Expose-Headers: Set-Cookie

如您所见,我包含了我的正确令牌,以及一个小的测试 cookie,只是为了验证它是否可以与一个非常简单的 cookie 一起使用。提示,它没有。

这是我的要求:

可悲的是,无论我尝试什么,chrome 和 e.g. Firefox 完全忽略了我的 cookie。无论我尝试什么,我都没有成功设置一个 cookie。

我现在在 localhost 和 *.web.core.windows.net 静态网站上尝试了它,但我就是无法让它工作。

我认为我的后端不是罪魁祸首,因为响应标头似乎设置正确。但有些事情不太对劲。我已经阅读了很多线程,现在提到应该设置什么,不应该设置什么,我现在可能已经全部尝试过了。无论是安全标志,同站点标志,等等。

我在这里错过了什么?

编辑:我在http://www.filedropper.com/cookieproblem添加了一个最小的可重现示例

运行:

  1. 导航到包含 CookieProblem.csproj 的“CookieProblem”文件夹。打开 cmd 并使用“func start”运行它(需要 Azure Functions CLI 工具)

  2. 现在,在 VS 中运行 BlazorApp1。打开页面并保持开发工具打开。在加载时,它应该向网络选项卡中名为“Run”的本地运行函数发出请求。

  3. 它现在也不应该为你设置 cookie。

【问题讨论】:

  • 您如何发出以 Set-Cookie 标头作为响应的 HTTP 请求?点击链接?提交表格?使用fetchXMLHttpRequest?还有什么?另外:它是跨域的吗?
  • @Quentin 我添加了请求 - 这是一个有点异国情调的设置,我使用的是 C# WebAssembly,所以它本质上是 C# HttpClient。不确定它被翻译成什么。关于跨域:本地没有,但在生产中它在不同的域上调用我的 Azure 函数,所以在那里跨域
  • @Quentin 我添加了一个包含我的问题的压缩 sln
  • 请阅读Something on my web site doesn't work. Can I just paste a link to it?。当外部资源消失或固定时,依赖于外部资源来理解的问题变得毫无用处。创建一个minimal reproducible example 并将其放入问题本身。 Stackoverflow 确实支持inline live demos

标签: c# http cookies azure-functions blazor


【解决方案1】:

好的,这个问题让我非常沮丧。我在我的缩小解决方案中修改了一段时间,并添加了一个具有 fetch() 功能的基本网站,因为我想知道这是否是由于 Blazor 造成的。

因此,对于 fetch() 代码,添加 credentials: 'include' 参数很重要。完成此操作后,一切正常。

好吧,在那之后,我花了很多时间在谷歌上搜索如何为 C# 的HttpClient 执行此操作。解决方案是使用HttpRequestMessage 并设置requestMessage.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);

此外,在服务器端,您应该确保配置您的例如local.settings.json 相应地在 Json 的“主机”子部分中设置“CORS”和“CORSCredentials”(在我的示例中,这是针对 Azure Function 项目,这可能对您有所不同)。

就是这样。现在 CORS cookie 可以工作了。找到这一行代码真是太棒了……

编辑:

这是我的 local.settings.json 文件的示例:

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet"
    },
    "Host": {
        "LocalHttpPort": 7071,
        "CORS": "https://localhost:5001",
        "CORSCredentials": true
    }
}

【讨论】:

  • 另外,你应该配置你的例如local.settings.json 相应地在 Json 的“主机”子部分中相应地设置了“CORS”和“CORSCredentials”。你能告诉我这是什么意思吗?
  • @ThomasFlinkow 抱歉,这可能有点令人困惑。在这个问题的范围内,我正在使用 Azure Functions,对于 Azure Functions,有一个配置文件,您可以在其中添加允许的 CORS 原始 URL,并且您可以在配置中将 CORSCredentials 设置为 true。
  • 可惜我的客户端不是服务器端,而是 Angular 应用。无论如何,我已经尝试了有关这些东西的所有建议更改,但仍然无法将我的 cookie 保存在 AspNetCore 3.1 应用程序端...
  • @sossenbinder 我终于赢了 :) 不知道最后一步到底是什么...但似乎删除了domain: null(完全删除域选项)
  • 当然可以,但是 SendAsync 没有任何参数来设置 BrowserRequestCredentials。我最终在 Program.cs 中 builder.Services.AddHttpClient(...) 的返回值上调用了 ConfigurePrimaryHttpMessageHandler(new MyHandler()) 并定义了一个 MyHandler 类:HttpClientHandler。在那里,您最终可以覆盖 SendAsync 并为请求设置 BrowserRequestCredentials。顺便说一句:根据 Fiddler 的说法,它不会修改请求标头,但会导致浏览器接受随响应发送的 cookie(参见 Set-Cookie-Header)。很奇怪。来自 HH 的问候
猜你喜欢
  • 2018-06-14
  • 2021-02-25
  • 2020-12-11
  • 2021-11-03
  • 2019-03-16
  • 1970-01-01
  • 2013-02-08
  • 2016-12-25
  • 2018-02-27
相关资源
最近更新 更多