【问题标题】:Why isn't my browser storing ASP MVC CORE 2 cookies?为什么我的浏览器不存储 ASP MVC CORE 2 cookie?
【发布时间】:2018-01-01 14:13:42
【问题描述】:

我有一个 Angular(4) 客户端 (localhost:4200),它调用 ASP MVC CORE 2 WebApi。其中一个调用 http://localhost:5000/api/session/resume 会在响应中返回一个 cookie。

在操作方法中,我返回了 3 个 cookie 用于测试目的。

    [AllowAnonymous, HttpPost, Route("api/session/resume")]
    public async Task<AccountSignInResponse> Resume([FromBody]SessionResumeCommand command)
    {
        AccountSignInResponse apiResponse = await Mediator.Send(command);
        if (!apiResponse.HasErrors) {
        Response.Cookies.Append("TestCookie", ..., new CookieOptions
        {
            Domain = "localhost",
            Expires = DateTimeOffset.Now.AddDays(100),
            HttpOnly = false
        });
        Response.Cookies.Append("TestCookie4200", ..., new CookieOptions
        {
            Domain = "localhost:4200",
            Expires = DateTimeOffset.Now.AddDays(100),
            HttpOnly = false
        });
        Response.Cookies.Append("TestCookie5000", ..., new CookieOptions
        {
            Domain = "localhost:5000",
            Expires = DateTimeOffset.Now.AddDays(100),
            HttpOnly = false
        });            }
        return apiResponse;
    }

此请求的标头是

Request URL:http://localhost:5000/api/session/resume
Request Method:POST
Status Code:200 OK
Remote Address:[::1]:5000
Referrer Policy:no-referrer-when-downgrade

响应头是

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Vary: Origin
Server: Kestrel
Set-Cookie: TestCookie=XXVtPqCdZ%2BBt9IbhP5Bi7sOLZ%2F%2BELB4fZ0rFArkM%2Be4%3D; expires=Fri, 03 Nov 2017 09:47:28 GMT; domain=localhost; path=/
Set-Cookie: TestCookie4200=XXVtPqCdZ%2BBt9IbhP5Bi7sOLZ%2F%2BELB4fZ0rFArkM%2Be4%3D; expires=Fri, 03 Nov 2017 09:47:28 GMT; domain=localhost:4200; path=/
Set-Cookie: TestCookie5000=XXVtPqCdZ%2BBt9IbhP5Bi7sOLZ%2F%2BELB4fZ0rFArkM%2Be4%3D; expires=Fri, 03 Nov 2017 09:47:28 GMT; domain=localhost:5000; path=/
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:4200
X-SourceFiles: =?UTF-8?B?QzpcZGV2XFhlcnhlc1xYZXJ4ZXMtU2VydmVyXFNlcnZlclxhcGlcc2Vzc2lvblxyZXN1bWU=?=
X-Powered-By: ASP.NET
Date: Wed, 26 Jul 2017 09:47:28 GMT

如您所见,cookie 是从 http://localhost:5000/api/session/resume 调用返回的,但它们并未存储在 Chrome、Edge 或 Firefox 中的本地 cookie 中。因此,当进一步请求图像和其他资源时,我只看到另一个 cookie (cookieLawSeen),而不是这个熟的。

当我在所有这些浏览器中浏览 localhost 的 cookie 时,我在存储中看不到任何 SessionToken。但是,如果我在 F12 开发人员工具中查看请求,我可以单击 [Cookies] 选项卡并看到 ResponseCookies 包含所有三个 cookie。

【问题讨论】:

  • 我有同样的问题。清除缓存并删除浏览器数据是我的解决方案。
  • 这不是我的解决方案,我只是第一次在该站点上使用了 firefox。无论如何我都试过了,但没有运气
  • 从 Angular 进行 api 调用时是否设置了 withCredentials` property to true?类似this.http.get('http://...', { withCredentials: true })
  • 我没有意识到 withCredentials 会允许接收 cookie,我以为它只是用于发送。那行得通,谢谢!添加它作为答案,我会接受它

标签: asp.net-mvc cookies asp.net-web-api asp.net-core


【解决方案1】:

我遇到了同样的问题,我发现在 .net core 2 中,会话 cookie 的默认值从“发送:任何类型的连接”更改为仅发送到同一来源。在我的情况下,服务器与本地主机位于不同的域中,并且没有将 cookie 发送到服务器。

为了允许它,您需要将名为 SameSite 的会话 cookie 的属性更改为 SameSiteMode.None。

除了上述之外,我还无法从本地邮递员访问本地主机服务器(即使它们具有相同的来源)。以上也解决了。

【讨论】:

    【解决方案2】:

    您需要使用withCredentials 属性。发送和接收 cookie 都需要它:

    指示是否应使用 cookie、授权标头或 TLS 客户端证书等凭据进行跨站点访问控制请求。

    每次从 Angular 进行 api 调用时,将其设置为 true。类似于以下内容:

    this.http.get('http://...', { withCredentials: true })
    

    【讨论】:

    • 我的救星!永远不会想到缺席会禁止设置 cookie。
    • 这确实花了我半天时间才弄明白!谢谢!
    猜你喜欢
    • 2022-01-26
    • 2018-10-30
    • 2017-10-07
    • 2021-10-13
    • 2021-01-15
    • 2021-07-20
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多