繁体   English   中英

ASP.Net Cookie 未保存到浏览器

[英]ASP.Net Cookies not being saved to the browser

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

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

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);
    }

现在,当我分析来自我的 Api 的响应时,我看到Set-Cookie标头和令牌本身很好: 响应标头 解码令牌:

{
  "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"
  ]
}

但是当我检查 cookie 时,什么都没有保存。

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

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

似乎没有任何效果。 我正在使用 Firefox 97.0.1。 你知道我还能尝试什么吗?

您是否尝试将Domain更改为localhost

根据我的测试,使用 `` 对我不起作用,然后我发现其他 cookie 显示它们属于域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";
}

在此处输入图像描述

我终于设法解决了这个问题......这是我所做的步骤:

  1. 将控制器方法更改为HttpGet ,所以现在看起来像这样:
[AllowAnonymous]
[HttpGet("authorize")] // <-- notice the difference
[ProducesResponseType((int)HttpStatusCode.OK)]
public async Task<IActionResult> AuthorizeAsync()
{
    //generating access token ommited for brevity
    SetTokenCookie(accessToken);
    return Ok(userIdentity);
}

由于某种原因,直接从浏览器(至少在我的情况下是 Firefox)调用 Post 请求似乎不适用于设置 cookie,即使响应看起来不错,但是当我将其更改为 Get 方法并以标准方式访问时方式(URL)它的工作原理。 我将不得不仔细检查 Post 方法是否适用于客户端(JavaScript)。

  1. 应用 Tiny Wang 的上述解决方案,这意味着将 cookie 域更改为localhost 拥有完整的 URL 确实可以防止 cookie 被保存。

编辑:正如 SSchmid 在评论中指出的那样,在 Firefox 中使用开发工具时,将方法更改为“Get”只是一种临时解决方法。 对于进一步的开发或生产,不建议将其保留为“获取”方法。

我设法通过使用[FromBody]属性让它运行。 这对我有用:

    [HttpPost("Login")]
    public async Task<IActionResult> Login([FromBody] LoginData data)
    {

        var user = await userManager.FindByEmailAsync(data.Email);
        if (user == null || !await userManager.CheckPasswordAsync(user, data.Password))
            return Unauthorized("Invalid Authentication");

        await signInManager.SignInAsync(user, data.rememberMe);
        var roles = (await userManager.GetRolesAsync(user)).ToList();
        var sUser = new Models.User(user, roles);
        return Ok(sUser);
    }

显然,如果您将 HTTPPOST 与参数结合使用,则它不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM