首页 > 解决方案 > C# CookieContainer 忽略 cookie

问题描述

我尝试自动登录到一个 PHP 生成的站点,该站点使用普通表单和 cookie 来验证用户。

对于连接,我使用以下代码:

SocketsHttpHandler socketHandler = new SocketsHttpHandler();
Uri baseUri = new Uri("mySite");
socketHandler.CookieContainer = new CookieContainer();
socketHandler.UseCookies = true;
socketHandler.AllowAutoRedirect = true;

//HttpClientHandler handler = new HttpClientHandler();
//handler.CookieContainer = new CookieContainer();

httpClient = new HttpClient(socketHandler);
httpClient.BaseAddress = baseUri;

try{
  (call login.php with PostAsync to login on the side)
  ...
  HttpResponseMessage response = await httpClient.GetAsync("main.php").ConfigureAwait(false);
  response.EnsureSuccessStatusCode();

  string responseText = await response.Content.ReadAsStringAsync();

  <Here I miss a cookie>

  ...
} catch(HttpRequestException e)
{
  Console.WriteLine(e.Message);
}

(代码已发布到登录站点,CookieContainter 现在存储 cookie:

sid=3m8heu881bmh38g2dahn2lj8ka
token=c3f0f448e90da26d33eaec84f4c334cbf5dedd03f03a758d48f494cc9525a740e452d2d868e42f9398af53da4ed73e7f

在 main.php 的 GetAsync 之后,我得到了大量新的 cookie(VS 调试器视图):

[0] "sid=qe1g1csvjc6h7075mlauv3pupf; path=/; HttpOnly"  string
[1] "sid=qe1g1csvjc6h7075mlauv3pupf; HttpOnly; Secure; SameSite=None"   string
[2] "sct_auth-hr_5a211a5ad7cd6ef0e05f18cef75d7c98=b3bcd0357d050f70be5d91e25d87d99f; HttpOnly; Secure; SameSite=None"    string
[3] "login_instance=hr; path=/; HttpOnly; Secure; SameSite=None"    string
[4] "foxy_items=%5B%5D; path=/; Secure; SameSite=None"  string
[5] "foxy_items=%5B%5D; path=/; Secure; SameSite=None"  string

有谁知道,为什么添加不在 CookieContainer 中的 cookie 3 (sct_auth-hr_5a211a5ad7cd6ef0e05f18cef75d7c98) ?其他 cookie 已正确添加。

作为解决方法,我使用:

response.Headers.TryGetValues("Set-Cookie", out var setCookie);

找到 Cookie 并手动添加。它有效,没有例外或其他可能阻止添加的事情。

标签: c#cookieshttpclientcookiecontainer

解决方案


推荐阅读