C#HttpClientまたはCookieContainerを使用してログイン後にHttpRequestがクッキーを送信しない解決方法および理由をシミュレート

2279 ワード

解決策
ユーザ名とパスワードを含むPOST要求を送信すると、「Set-cookie」を含むHttpWebResponseが得られ、その後、次のコードが追加されるべきである
//Cookies CookieContainer  ,Response HttpWebResponse  
Uri Host = new Uri("http://example.cn");
foreach (Cookie cookie in Response.Cookies)
    cookies.SetCookies(Host, ("" + cookie.Name + "=" + cookie.Value));

の原因となる
簡単に言えば、この問題の原因はCookieContainerの設計不足、ロバスト性が足りないことにある.
ここではCookieに関する知識を簡単に理解します.rfc 6265第5.3節では、ブラウザが各Cookieを格納する際にこれらのフィールドを含めるべきだと定義しています.name、value、expiry-time、domainなどですが、各サイトがSet-cookie時にユーザーにすべてのフィールドを返すように設計されているわけではありません.例えば、下図の場合はname、value、expiryの3つのフィールドしか返されません.
这里写图片描述
ポイントは、上図のSet-Cookieヘッダのようにdomainフィールドがデフォルトであり、一般的なブラウザでは、デフォルトdomainのSet-Cookieフィールドが受信されると、今回のリクエストアドレスのHostがアクティブに追加されることです.CookieContainerの設計当初は、ユーザーがUrlを要求されたHostをCookiesに追加するのを自発的に助けるつもりはなかったが(毛とは知られていない)、CookieContainerで起こったことは、CookieContainerがdomainのデフォルトのSet-Cookieフィールドを見たとき、requestのUrlをCookieに直接追加したことだ.
これはどんな結果をもたらしますか?ホストがHであると仮定しますttp://example.cnログインすると/user/loginに向かいます.php POSTは、メッセージの一部を返し、アドレスはCookiesに戻るが、CookieContainerがこれらのCookiesに完全なアドレスを保存しているため、これらのCookiesはHにアクセスするだけであるttp://example.cn/user/login.phpと入力します.これがテーマの問題になった.
上記のコードは、既存のCookieContainerにHostで設定したcookieを手動で追加することで、/user/homeにアクセスすることができます.phpまたは他のサブノードの場合、Cookiesは正常に送信できます.
HttpClientについて
HttpClientタイプCookiesを保存する際に使用するのはFlagがProtectのCookieContainerオブジェクトなので、HttpClientもそっくりの問題に遭遇しますし、ここではオブジェクトがProtectなので手動で修正することはできませんが、HttpClientでこの問題をどのように解決するかはしばらく分かりません.
リファレンスリンク
1、HttpWebRequest and CookieContainer - login to a website 2、HttpWebRequest with CookieContainer problem in .NET 4+?