墨汁 さんが書きました:あまりこの手のことについては詳しくないのですが、セッションcookieとは今ログインしているユーザーの情報を管理しているものと考えてよろしいでしょうか?
ユーザーのログイン状態をセッションCookieで行っているか永続化Cookieで行うかは,サイトに依存します。
永続化Cookieとは有効期限の指定された (Set-Cookieフィールドがレスポンスで返されるときにexpiresが指定された) Cookieであり,その有効期限までの間,ブラウザは対象サイトにCookieを送信します。
セッションCookieとは有効期限の指定されていない (Set-Cookieフィールドがレスポンスで返されるときにexpiresが指定ていない) Cookieであり,ブラウザが終了されるまでの間,ブラウザは対象サイトにCookieを送信します。
簡易テストページを作ってみました。
http://www.ookubo.ws/CookieTest/test.php
上記のページへの最初のアクセスでは,OldValueはどちらも(undefined)のはずです。
再読込すると,OldValueとNewValueは同じ値になるするはずです。
次に,ブラウザを終了した後再度起動してアクセスすると,セッションクッキーのOldValueは(undefined)ですが,永続化クッキーは前の値が残っているはずです。
# 永続化クッキーの生存期間が60秒程度なので,ちょっと時間が経つと永続化クッキーが再発行される可能性があります。
上記を調べたら,クッキーを削除しておいてください。
さて,ここからが本題ですが,WebBrowserコントロールをFormに貼り付けて,Loadイベントで上記ページにNavigateするWindows Forms アプリケーションを作ります。
そして,そのプログラムを2つ起動してみてください。
セッションクッキーのOldValue値はどちらも(undefined)でNewValue値は2つのプロセスで異なるはずです。
それに対して,永続化クッキーのOldValue値は,先に起動した方の値が(undefined)で後から起動した方の値は先に起動した方の永続化クッキーのNewValue値と同じ値になっているはずです。
この,永続化クッキーの値が同じになることが,今回の問題の根本です。
なので,
墨汁 さんが書きました:また、私はセッションcookieの勉強がしたいわけではないのです
墨汁 さんが書きました:私が求めているゴールはwebbrowserクラスでの別アカ同時ログインであって、セッションcookieではありません
と書かれていますが,クッキーについての知識なしに今回の問題は解決しません。
対象のサイトがセッションcookieを発行しているのであれば,そもそも問題は発生しないわけですから。
で,IEコンポーネント (含System.Windows.Forms.WebBrowser) でCookieを共有しない方法というのは,FAQで「できない」が回答です。
InternetGetCookieとInternetSetCookieを駆使すれば,ある程度できなくはないですが,共有しているものをアクセス前に自分のもので置き換えればできる,という話なので。
で,別のエンジンを探すと
WebKit.NETとか,
geckofxとか見つかります。
これらの別のエンジンでどうなるかは試していませんが,少なくともIEコンポーネントとCookieを共有することはありません。
とりあえず,geckofxでは,Xpcom.Initializeの後にXpcom.ProfileDirectoryに異なる値を設定することで,永続化Cookieは共有されなくなりました。
なので,この方法を使うことで目的は達成されるかと思います。
一応,簡易テストページのソース
► スポイラーを表示
コード:
<?php
define('SESSION_COOKIE', 'sessionCookie');
define('PERMANENT_COOKIE', 'permanentCookie');
if (isset($_COOKIE[SESSION_COOKIE]))
{
$sessionCookie = $_COOKIE[SESSION_COOKIE];
$newSessionCookie = $sessionCookie;
}
else
{
$sessionCookie = '(undefined)';
$newSessionCookie = md5(uniqid('', TRUE));
}
if (isset($_COOKIE[PERMANENT_COOKIE]))
{
$permanentCookie = $_COOKIE[PERMANENT_COOKIE];
$newPermanentCookie = $permanentCookie;
}
else
{
$permanentCookie = '(undefined)';
$newPermanentCookie = md5(uniqid('', TRUE));
}
if (isset($_GET['unset']))
{
$newSessionCookie = '(undefined)';
$newPermanentCookie = '(undefined)';
setcookie(SESSION_COOKIE, '', time() - 1);
setcookie(PERMANENT_COOKIE, '', time() -1);
}
else
{
setcookie(SESSION_COOKIE, $newSessionCookie);
setcookie(PERMANENT_COOKIE, $newPermanentCookie, time() + 60);
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cookie テスト</title>
</head>
<body>
<table>
<tr>
<th></th>
<th>Old Value</th>
<th>New Value</th>
</tr>
<tr>
<th>セッションクッキー</th>
<td><?php echo htmlspecialchars($sessionCookie, ENT_COMPAT, 'UTF-8') ?></td>
<td><?php echo htmlspecialchars($newSessionCookie, ENT_COMPAT, 'UTF-8') ?></td>
</tr>
<tr>
<th>永続化クッキー</th>
<td><?php echo htmlspecialchars($permanentCookie, ENT_COMPAT, 'UTF-8') ?></td>
<td><?php echo htmlspecialchars($newPermanentCookie, ENT_COMPAT, 'UTF-8') ?></td>
</tr>
</table>
<?php if (isset($_GET['unset'])) { ?>
<p><a href="?">クッキーの発行</a></p>
<?php } else { ?>
<p><a href="?unset=ture">クッキーの削除</a></p>
<?php } ?>
</body>
</html>