ASP.Net Cookie 未保存到浏览器

tof*_*325 5 c# cookies rest asp.net-core

我只是想保存包含安全令牌的 cookie,但它们不会保留在浏览器中。这是我AuthController保存 cookie 的方法(简化):

[AllowAnonymous]
[HttpPost("authorize")]
[ProducesResponseType((int)HttpStatusCode.OK)]
public async Task<IActionResult> AuthorizeAsync()
{
    //generating access token ommited for brevity
    SetTokenCookie(accessToken);
    return Ok(userIdentity);
}
Run Code Online (Sandbox Code Playgroud)

SetTokenCookie方法:

private void SetTokenCookie(string accessToken)
    {
        var options = _jwtOptions.AccessToken;
        var cookieOptions = new CookieOptions()
        {
            HttpOnly = true,
            IsEssential = true,
            Secure = false,
            SameSite = SameSiteMode.Strict,
            Domain = options.Issuer, //http://localhost:3394 by default
            Expires = DateTime.UtcNow.AddDays(14)
        };

        Response.Cookies.Append(options.Name, accessToken, cookieOptions);
    }
Run Code Online (Sandbox Code Playgroud)

现在,当我分析 Api 的响应时,我发现Set-Cookieheader 和 token 本身都很好: 响应标头 解码后的令牌:

{
  "id": "70132f61-4d83-4772-9685-7a77a9204685",
  "name": "admin",
  "email": "xyz@xyz.pl",
  "role": "Administrator",
  "persist": "True",
  "nbf": 1646336045,
  "exp": 1646336945,
  "iat": 1646336045,
  "iss": "http://localhost:3394",
  "aud": [
    "blog.webgateway",
    "blog.blogging",
    "blog.comments",
    "blog.users"
  ]
}
Run Code Online (Sandbox Code Playgroud)

但是当我检查cookies时,什么也没有保存。

我知道与此问题相关的主题有很多,但我已经用完了可以在网上找到的想法:

  1. 我擦除了浏览器中本地主机的存储
  2. 我在主机文件中添加了自定义条目并相应地更改了 cookie 域
  3. 我尝试设置 cookie domain = null 或不同的路径
  4. 我添加了 Cors 并允许凭据、任何方法、任何标头、任何来源
  5. 我在浏览器中尝试了更宽松的设置
  6. 我尝试更改 cookie 选项 ( HttpOnly, Secure, SameSite)
  7. UseHttpsRedirection()从我的中删除Startup.cs并确保我通过以下方式连接HTTP

似乎什么都不起作用。我使用的是 Firefox 97.0.1。你知道我还可以尝试什么吗?

Tin*_*ang 2

您是否尝试将其更改Domainlocalhost

根据我的测试,使用``对我来说不起作用,然后我发现其他cookie显示它们属于domain localhost,所以我使用localhost代替,然后我可以看到新创建的cookie。我测试通过chrome中的工具调用api,所以我认为它应该与你的场景类似。

public string saveCookie() {
    var cookieOptions = new CookieOptions()
    {
        HttpOnly = true,
        IsEssential = true,
        Secure = false,
        SameSite = SameSiteMode.Strict,
        Domain = "localhost", //using https://localhost:44340/ here doesn't work
        Expires = DateTime.UtcNow.AddDays(14)
    };

    Response.Cookies.Append("testCookie", "Cookie content", cookieOptions);
    return "hello world";
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述