ASP.Net Cookie 未保存到浏览器
ASP.Net Cookies not being saved to the browser
我只是想保存包含安全令牌的 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);
}
和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
header 和令牌本身都很好:
解码令牌:
{
"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 时,没有任何内容被保存。
我知道有很多主题与此问题相关,但我已经 运行 无法在网上找到想法:
- 我擦除浏览器中的本地主机存储空间
- 我在主机文件中添加了自定义条目并相应地更改了 cookie 域
- 我尝试设置 cookie 域 = null 或不同的路径
- 我添加了 Cors 并允许凭据、任何方法、任何 headers、任何来源
- 我在浏览器中尝试了更宽松的设置
- 我尝试更改 cookie 选项(
HttpOnly
、Secure
、SameSite
)
- 我从
Startup.cs
中删除了 UseHttpsRedirection()
并确保我通过 HTTP
连接
似乎没有任何效果。我正在使用 Firefox 97.0.1。你知道我还能尝试什么吗?
您是否尝试将 Domain
更改为 localhost
?
根据我的测试,使用 `` 对我不起作用,然后我发现其他 cookie 显示它们属于域 localhost
,所以我改用 localhost,然后我可以看到新创建的曲奇饼。我测试在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";
}
我终于设法解决了这个问题...以下是我执行的步骤:
- 将控制器方法更改为
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) 有效,我将不得不 double-check。
- 套用Tiny Wang的上述解决方案,也就是将cookie域更改为
localhost
。拥有完整的 URL 确实会阻止保存 cookie。
编辑: 正如 SSchmid 在评论中指出的那样,在 Firefox 中使用开发工具时,将方法更改为“Get”只是一个临时解决方法。对于进一步的开发或生产,不建议将其保留为“获取”方法。
我只是想保存包含安全令牌的 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);
}
和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
header 和令牌本身都很好:
{
"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 时,没有任何内容被保存。
我知道有很多主题与此问题相关,但我已经 运行 无法在网上找到想法:
- 我擦除浏览器中的本地主机存储空间
- 我在主机文件中添加了自定义条目并相应地更改了 cookie 域
- 我尝试设置 cookie 域 = null 或不同的路径
- 我添加了 Cors 并允许凭据、任何方法、任何 headers、任何来源
- 我在浏览器中尝试了更宽松的设置
- 我尝试更改 cookie 选项(
HttpOnly
、Secure
、SameSite
) - 我从
Startup.cs
中删除了UseHttpsRedirection()
并确保我通过HTTP
连接
似乎没有任何效果。我正在使用 Firefox 97.0.1。你知道我还能尝试什么吗?
您是否尝试将 Domain
更改为 localhost
?
根据我的测试,使用 `` 对我不起作用,然后我发现其他 cookie 显示它们属于域 localhost
,所以我改用 localhost,然后我可以看到新创建的曲奇饼。我测试在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";
}
我终于设法解决了这个问题...以下是我执行的步骤:
- 将控制器方法更改为
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) 有效,我将不得不 double-check。
- 套用Tiny Wang的上述解决方案,也就是将cookie域更改为
localhost
。拥有完整的 URL 确实会阻止保存 cookie。
编辑: 正如 SSchmid 在评论中指出的那样,在 Firefox 中使用开发工具时,将方法更改为“Get”只是一个临时解决方法。对于进一步的开发或生产,不建议将其保留为“获取”方法。