web-dev-qa-db-ja.com

.Net MVCアプリケーションでセキュアフラグがCookieに設定されていない

Web.ConfigファイルとGlbal.asax.csファイルに以下のコード行を含めましたが、ブラウザーで開発者ツールを使用しても、以下のCookieにセキュアフラグが設定されていません。また、my IISでSSLSettingsを構成しました(チェックボックスrequireSSLを選択)。

受信しただけでなく送信したCookieにも、すべてのCookieにセキュア属性を設定したいと思います。

Web.config

<httpCookies requireSSL="true"/>

Global.asax.cs

protected void Application_EndRequest(object sender, EventArgs e)
        {
            if (Request.IsSecureConnection == true && HttpContext.Current.Request.Url.Scheme == "https")
            {
                Request.Cookies["ASP.NET_SessionID"].Secure = true;
                if (Request.Cookies.Count > 0)
                {
                    foreach (string s in Request.Cookies.AllKeys)
                    {
                        Request.Cookies[s].Secure = true;
                    }
                }

                Response.Cookies["ASP.NET_SessionID"].Secure = true;
                if (Response.Cookies.Count > 0)
                {
                    foreach (string s in Response.Cookies.AllKeys)
                    {
                        Response.Cookies[s].Secure = true;
                    }
                }
            }
        }

次に、アプリケーションをIIS 7.5でローカルマシンにホストしました。SSL設定でRequireSSLオプションを有効にしました。[参照] * .443(https)をクリックすると、ローカルホストがHTTPSで実行されているのが見えますが、ブラウザでcookie属性を確認すると、secureフラグが設定されていません。

ここに設定がありませんか?

Screenshot of developer tools, where a recieved cookie is marked as secure but sent cookies are not.

3
Ask_SO

混乱は、コーディングや設定のエラーではなく、Cookieの動作に関する誤解の結果です。

サーバーがCookieを作成または変更する場合は、Set-Cookie応答ヘッダーを使用して行います。そこで、サーバーは、ブラウザがCookieを処理する方法を指定することもできます。安全であるかどうかなど、どのくらいの期間保持するか。この情報は、Cookieが最初に作成されたときに一度だけ送信されます。

すべてのリクエストで、クライアントはすべてのCookieをCookiesリクエストヘッダーでサーバーに送信します。次に、名前と値のみを送信します。追加情報(セキュアフラグなど)は送信されません。これらはサーバーからクライアントへの指示であり、クライアントがサーバーに指示を繰り返す必要はありません。

したがって、サーバーがSet-Cookieヘッダーにsecureフラグを含めた場合、Cookieは「安全」です。その後、クライアントがCookiesヘッダーで送信するものは関係ありません。したがって、リクエストCookieを安全であるとマークしようとしても、ほとんど意味がありません。

では、送信されたCookieが開発者ツールで安全であると報告されないのはなぜですか?それは単にフィールドがそれらに適用可能ではないため、空白のままにされているからです。 IEでそれを行う方法はわかりませんが、Chromeに切り替えると、[アプリケーション]タブですべてのCookieのリストを取得でき、どのCookieであるかを簡単に確認できます安全とマークされています。

免責事項:私はASP.NETプログラマではありません。

7
Anders