ASP.netのセッション管理

仕事でASP.net使うことになったのでSessionのお勉強中。
この本を参考にしてこんなコードを書いた。

public partial class session : System.Web.UI.Page
    {
        protected const string KEY_STRING = "KEY";

        protected void Page_Load(object sender, EventArgs e)
        {
            //明示的にSession[<KEY_STRING>]へ値をセットしないと
            //新たなセッションIDが発行され続ける
            if (!IsPostBack)
            {
                Session[KEY_STRING] = 1;
            }
            else
            {
                Session[KEY_STRING] =     
                    Convert.ToInt32(Session[KEY_STRING]) + 1;
            }
            
            lblSession.Text =
                string.Format("SESSION_ID={0}<br />{1}回目",
                Session.SessionID,
                Session[KEY_STRING]);
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            //セッション解放
            Session.Abandon();
        }
    }

セッション変数の代入・参照・削除までは想定通り動くが、
セッション解放を解放した後もなぜか同じセッションIDが発行され続けてしまう。

少し調べてみたところ、どうやらASP.netのSessionは新たなセッションIDを発行する機能を持たないようだ。
参考:ASP.NETで忘れずにやっておくべきこと(2) セッションハイジャック対策 - 熱燗ロックのブログ
   ASP.NET でセッション ID が再利用されるしくみと理由について


この問題の対策として、セッションCookieを以下のように消してしまう。

protected void Button1_Click(object sender, EventArgs e)
        {
            //セッション解放
            Session.Abandon(); 
            //セッションCookieを消す
            Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
        }

これで、解放後に新たなセッションIDが発行されるようになった!
ヨカッタヨカッタ……と思っていたら、まだ問題が残っているらしい。
参考:http://d.hatena.ne.jp/teracc/20100424#1272092128

なんだかなぁ。

絶対現場主義VisualC#実践講座 Webアプリケーション編―開発の現場から生まれた実践テクニック&TIPS集

絶対現場主義VisualC#実践講座 Webアプリケーション編―開発の現場から生まれた実践テクニック&TIPS集