ASP.NET SessionState 用クッキーに Domain 属性をつける

Forms認証については、以下のような設定で Domain 属性をつけて複数ホスト名に対してクッキーを有効にし認証が通るようにできる。(authentication の forms 要素 (ASP.NET 設定スキーマ) を参照)

<system.web>
 <authentication mode="Forms">
  <forms domain="xx.example.com" />
 </authentication>
..
<system.web>

一方、sessionState については同様の属性がない。(sessionState 要素 (ASP.NET 設定スキーマ)) Domain 設定をするにはコードを書いて対処をする必要がある。(検索すると cookieless にすればいい、というような話も出てくるのだが)

単純に ASP.NET_SessionId クッキーを生成するだけではだめで、システムが生成するクッキーを上書きするか削除しなければならない。

ASP.NET Application Life Cycle Overview for IIS 5.0 and 6.0 を見たところ、Responseオブジェクトを参照してStreamとして出力し始めるのは [19. Perform response filtering if the Filter property is defined.] から。ということで PostReleaseRequestState イベントの時点でできあがっているクッキーオブジェクトにDomain属性を設定して対処することとした。

以下の内容を Global.asax に記述することにより、Domain 属性をつけることができる。

void Application_PostReleaseRequestState()
{
    HttpContext context = HttpContext.Current;
    HttpCookie sessionCookie = context.Response.Cookies["ASP.NET_SessionId"];
    if (sessionCookie != null && String.IsNullOrEmpty(sessionCookie.Value)) sessionCookie.Domain = "xx.example.com";
}
(4/22追記)上記の処理だけではうまくいかない場面があったため、現在はサポート関数が以下のようになっている。
void Application_PostReleaseRequestState(HttpContext context, string ドメイン名)
        {
            //ポート番号を削除する
            if (ドメイン名.IndexOf(":") > 0)
            {
                ドメイン名 = ドメイン名.Remove(ドメイン名.IndexOf(":"));
            }
            HttpCookie sessioncookie;
            string sessionid;
            if (!string.IsNullOrEmpty(context.Request.Cookies["ASP.NET_SessionId"].Value))
            {
                sessionid = context.Request.Cookies["ASP.NET_SessionId"].Value;
            }
            else
            {
                sessionid = context.Response.Cookies["ASP.NET_SessionId"].Value;
            }
            sessioncookie = context.Response.Cookies["ASP.NET_SessionId"];
            if (sessioncookie != null && !String.IsNullOrEmpty(sessionid))
            {
                sessioncookie.Value = sessionid;
                sessioncookie.Domain = ドメイン名;
            }
        }

ASP.NET SessionState 用クッキーに Domain 属性をつける」への1件のフィードバック

  1. 智史 より:

    ISessionIDManager を実装する方がよさそう。
    とはいえどうもdomain の設定はFireFoxではうまく動いていない模様のためクッキーを使わない方法を検討中

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。