none
Cookie処理について<未解決箇所ありだがクローズ>

    質問

  • とある .NET4.5のASP.NET(C#)環境下で下記のようにCookie設定している共通パーツのソースがありまして、

    見た感じ問題なくCookieがSet-Cookieされるように思えたのですが、発行されたCookieをブラウザー側で見ると

    ドメイン指定が正しく行なわれていませんでした。

    何が問題でドメイン指定されていないのでしょうか?

    下の例で言うと t.test.jp と言うサーバーで test.jp のドメイン指定を行なう事はできないのでしょうか?

    正しく動作する1つのクッキーに複数の項目を持たせてドメイン指定する方法を教えてください。

    HttpContext.Current.Response.Cookies["クッキー1"]["値1"] = 1;
    HttpContext.Current.Response.Cookies["クッキー1"]["値2"] = "2";
    HttpContext.Current.Response.Cookies["クッキー1"]["値3"] = "ASVBC";
    HttpContext.Current.Response.Cookies["クッキー1"].Expires = "2016-12-31 10:00:00";
    HttpContext.Current.Response.Cookies["クッキー1"].Path = "/";
    HttpContext.Current.Response.Cookies["クッキー1"].Domain = "test.jp";
    
    HttpContext.Current.Response.Cookies["クッキー2"]["値5"] = 5;
    HttpContext.Current.Response.Cookies["クッキー2"]["値2"] = "2";
    HttpContext.Current.Response.Cookies["クッキー2"]["値6"] = "32rrff";
    HttpContext.Current.Response.Cookies["クッキー2"].Expires = "2016-12-30 05:00:00";
    HttpContext.Current.Response.Cookies["クッキー2"].Path = "/";
    HttpContext.Current.Response.Cookies["クッキー2"].Domain = "t.test.jp";
    以上、宜しくお願い致します。


    • 編集済み miniHORI 2016年12月20日 1:09
    2016年12月9日 9:46

回答

  • 本件、質問に書きましたコードでも間違えてはいないベターな書き方である事がわかりましたが、うまくいかない環境またはケースがあるようですね。 Cookieの使い方を変える方法で回避する事になりましたので、本件クローズとさせて頂きます。
    • 回答としてマーク miniHORI 2016年12月20日 1:13
    2016年12月20日 1:08

すべての返信

  • アップされたコードには間違いがあってコンパイラも通らないと思いますが、それは本題とは違いますのでとりあえず置いといて・・・

    質問者さんがアップされたコードで間違いを直してページに設定すると以下のような応答ヘッダがブラウザに返されます。

    Set-Cookie: クッキー1=値1=1&値2=2... domain=test.jp; path=/
    Set-Cookie: クッキー2=値5=5&値2=2... domain=t.test.jp; path=/

    で、この domain=... の意味ですが、それを指定しないと Cookie を発行したホストのみに送信される、指定すると指定したホストおよびそのサブドメインのホストに送信されるということです。

    そこはブラウザのみの問題で、ASP.NET にはもう関係ない世界の話です。

    詳しくは http Set-Cookie domain 等をキーワードにググるといろいろヒットしますので調べてください。例えば下記:

    Set-Cookie ヘッダを使って Cookie を保存する
    http://www.yunabe.jp/docs/cookie_and_security.html

     

    2016年12月9日 10:44
  • マルチポストのようですのでマルチポスト先の URL を貼っておきます。
    http://qa.atmarkit.co.jp/q/10119

    質問者さんへ>
    マルチポストは歓迎されません。理由が分からなければ「マルチポスト」でググってみてください。少なくともこのフォーラムでは遠慮していただくよう管理人の方から案内が出ています。

    2016年12月9日 10:59
  • 【追伸】

    自分では検証してませんが、以下の記事によるとブラウザによって対応が異なり、例えば IE9 では domain 指定があってもなくてもサブドメインに送信されるそうです。

    CookieのDomain属性は *指定しない* が一番安全
    http://blog.tokumaru.org/2011/10/cookiedomain.html

    2016年12月10日 2:20
  • こんにちは、miniHORI さん

    フォーラム オペレーターの立花楓です。

    外部サイトでも同一の内容のご投稿をいただいていますが、複数のフォーラムや掲示板でご質問いただくと情報が分散して共有できなくなってしまいます。
    恐れ入りますが、いずれかのスレッドへ絞って投稿いただけますようお願い致します。

    また、以下のお知らせに、当フォーラムのご利用方法について記載していますので、ご確認いただけますと幸いです。

    ・フォーラムのご利用方法、ヘルプ、回答のガイドラインに関するお知らせ
    https://social.msdn.microsoft.com/Forums/ja-JP/93915a1e-22bc-4a23-83b1-f1ff47dccc82?forum=suggestja


    よろしくお願いいたします。


    TechNet Community Support 立花楓

    2016年12月12日 5:59
    モデレータ
  • 色々と返信を頂きありがとうございます。

    ですが、Set-Cookieやマルチポストに関して少し理解できましたが、結果として質問であげている書き方が問題で動かないのか

    どうなのかが判断できませんでした。

    ※ 質問時のソース内にある Expires の値はstringではなくDateTime値をセットしています。書き間違えました。

    2016年12月16日 5:22
  • > 結果として質問であげている書き方が問題で動かないのかどうなのかが判断できませんでした。

    質問者さんの言う「動く」というのは具体的にどういうことですか?

    ひょっとして、クッキーの domain 属性で指定しているドメイン(質問者さんの例では test.jp)とそのクッキーを送信しているサイトのドメインが違っていませんか? もしそうだとすると、そもそもそういうことはできません。

    最初のレスで紹介した記事の通りです。抜粋下記:

    "また domain属性で指定するドメインは現在のホスト名を含むドメインでなくてはなりません。 そうでない値を指定した場合は無視されます。例えばあるページが www.example.com にある場合、domain に example.com を指定してクッキーが example.com 以下のあらゆるホストに対して送信されるように設定できますが、 domain に google.com を指定して google.com に対してクッキーを送信するように設定することはできません。また、domain属性に abc.www.example.com を指定してサブドメイン abc.www.example.com にのみクッキーが送信されるようにすることもできません。"

    2016年12月16日 6:38
  • > 結果として質問であげている書き方が問題で動かないのかどうなのかが判断できませんでした。

    質問者さんの言う「動く」というのは具体的にどういうことですか?

    ひょっとして、クッキーの domain 属性で指定しているドメイン(質問者さんの例では test.jp)とそのクッキーを送信しているサイトのドメインが違っていませんか? もしそうだとすると、そもそもそういうことはできません。

    最初のレスで紹介した記事の通りです。抜粋下記:

    "また domain属性で指定するドメインは現在のホスト名を含むドメインでなくてはなりません。 そうでない値を指定した場合は無視されます。例えばあるページが www.example.com にある場合、domain に example.com を指定してクッキーが example.com 以下のあらゆるホストに対して送信されるように設定できますが、 domain に google.com を指定して google.com に対してクッキーを送信するように設定することはできません。また、domain属性に abc.www.example.com を指定してサブドメイン abc.www.example.com にのみクッキーが送信されるようにすることもできません。"

    質問にも書きました通りの「HttpContext.Current.Response.Cookies」の使い方が誤っていないのかと言う点が
    最初にあります。私は質問に書いたようなCookieの指定方法で問題なく動くと判断しておりますが、うまく動い
    ていないため、他の人にも見て頂き、書き方に問題がないか、書き方的に動かなくなるケースがあるベストでは
    ない書き方なのかをまずは、把握したいのです。

    その上で、書き方に問題が無いとすると、この書き方で組み込んでいるイベントポジションが問題なのかを判断
    すると言った流れで解決に向かおうとしています。

    • 編集済み miniHORI 2016年12月19日 1:31 改行位置修正
    2016年12月19日 1:29
  • 前のレスの私の質問、

    > 質問者さんの言う「動く」というのは具体的にどういうことですか?

    に答えていただかないと話が噛み合わないかもしれません。答えていただけませんか?

    質問者さんの現在の疑問、

    > 「HttpContext.Current.Response.Cookies」の使い方が誤っていないのか

    に対する答えは、「動く」というのは具体的にどういうことかによって変わってきます。

    #引用は必要最低限にとどめてください。スレッドが見にくくなるので。

    2016年12月19日 4:52
  • > 質問者さんの言う「動く」というのは具体的にどういうことですか?

    に答えていただかないと話が噛み合わないかもしれません。答えていただけませんか?

    質問者さんの現在の疑問、

    > 「HttpContext.Current.Response.Cookies」の使い方が誤っていないのか

    に対する答えは、「動く」というのは具体的にどういうことかによって変わってきます。

    質問に書きました通り「HttpContext.Current.Response.Cookies」を使った書き方で、

    t.test.jp と言うサーバーで test.jp のドメイン指定を行なった結果、発行されるCookieは

    t.test.jpではなくtest.jpのドメイン指定でレスポンスが帰ってくるのでしょうか。

    ※ 「動く」とは、指定した命令が指定通りに機能して動くかと言う意味で使用しています。

    2016年12月19日 11:12
  • > 質問に書きました通り
    ・・・中略・・・
    >「動く」とは、指定した命令が指定通りに機能して動くかと言う意味で使用しています。

    質問者さんは書いたつもりかもしれませんが、少なくとも私には話が通じてないです。

    質問者さんのレスの文面を読む限りですが、質問者さんのクッキーに関する理解が足りなくて、質問が的外れになっているからだと思います。

    ・・・と言っていても始らないので、調べる手順を書くと:

    (1) まず、最初の私にレスでも指摘しましたが、コンパイラも通らないミスを直してください。どこをどう直すかは分かりますよね。

    (2) そこがクリアできたら、Web サーバーから発行されるクッキーを Fiddler 等のキャプチャツール(IE なら F12 開発者ツールでも可)で調べて、期待通りになっているか確認してください。

    (3) ブラウザがクッキーを受け取っているか調べてください。IE なら F12 開発者ツールを起動して、[キャッシュ(C)]⇒[Cookie 情報を表示する(I)]で分かるはずです。

    (4) ポストバックするなどして同じドメインのページを要求してクッキーがサーバーに送信されているかを Fiddler 等のキャプチャツール確認してください。
    2016年12月19日 13:10
  • 本件、質問に書きましたコードでも間違えてはいないベターな書き方である事がわかりましたが、うまくいかない環境またはケースがあるようですね。 Cookieの使い方を変える方法で回避する事になりましたので、本件クローズとさせて頂きます。
    • 回答としてマーク miniHORI 2016年12月20日 1:13
    2016年12月20日 1:08
  • 間違えていないということですが質問者さんのコードはコンパイラも通りませんでした。どのように直したのですか? ベターな書き方とのことですが何と比較してどのようにベターなのですか? うまく行かない環境とは何でしょう? このフォーラムは技術者同士の情報交換の場ということに配慮いただき、そのあたりの情報を提供してからクローズしていただけませんか?
    2016年12月20日 5:35
  • miniHORIさんは、どのような環境で、どのようなコードを実行し、どのように観測することで、どのようになると期待したところ、どのような結果が得られたのでしょうか。質問に答えるには、これらの情報が必要ですが、「どのようなコードを実行した」という情報しかありません。

    「とある .NET4.5のASP.NET(C#)環境下」・・・ウェブブラウザの環境(種類、バージョン)が抜けています。
    「見た感じ問題なくCookieがSet-Cookieされる」・・・どうやって、あるいは、何をどのように見たのでしょうか。
    「ドメイン指定が正しく行なわれていません」・・・どうなることを期待して、実際にはどうだったのでしょうか。あるいは、どのような結果から、「正しく行われていない」と判断したのでしょうか。

    「Panel.Controls に追加・・・」の方も、そういう、質問するにあたって基本的な情報が抜けていると思います。次は気を付けていただけたらと思います。

    コンピュータは、(今のところ)ない情報を作りませんが、人間は、自分が知っていることで補完してしまいます。今回は、この補完が(補完:回答を得るという本来の目的に対して)悪い方に行ったかなぁ、と感じました。


    Jitta@わんくま同盟


    • 編集済み Jitta 2016年12月22日 9:05 補完
    2016年12月20日 12:17
  • t.test.jp と言うサーバーで test.jp のドメイン指定を行なう事はできないのでしょうか?

    Cookieのドメイン指定には複雑な問題があります。

    • まず属性型JPドメインwww.example.co.jp利用者がドメイン指定としてexample.co.jpを設定するのは正当な行為です。
    • また汎用JPドメインwww.example.jp利用者がドメイン指定としてexample.jpを設定するのは正当な行為です。(質問の内容)
    • しかし汎用JPドメイン向けに2階層の指定が認められるのか? という問題があります。もし認められてしまうとexample.co.jp利用者がco.jpを設定できてしまい、非常に危険です。
    • 属性型ドメインはco.jpなど限定的であり例外指定すればいいのではという考え方もあります。
    • しかし地域型ドメイン(例えば東京都であればtokyo.jp)の問題があります。こちらは限定できず汎用JPドメインと区別しきれません。

    このように汎用JPドメインと地域型JPドメインが混在しているため、JPドメインに限ってはCookieのドメイン指定はまともに行えるとは言い難い状況であり、これを受けて各Webブラウザーは異なる挙動をすることが予想されます。

    結論として、JPドメインに関してはCookieのドメイン指定を諦める、もしくは属性型JPドメインを使用することをお勧めします。

    2016年12月20日 22:17