.ASPXAUTH Cookieをhttpsのみに設定しましたが、ASP.NET_SessionIdで同じことを効果的に行う方法がわかりません。
サイト全体がHTTPSを使用しているため、Cookieがhttpとhttpsの両方で機能する必要はありません。
Anubhav Goyalによるブログ記事 から抜粋したコードスニペットを以下に示します。
// this code will mark the forms authentication cookie and the
// session cookie as Secure.
if (Response.Cookies.Count > 0)
{
foreach (string s in Response.Cookies.AllKeys)
{
if (s == FormsAuthentication.FormsCookieName || "asp.net_sessionid".Equals(s, StringComparison.InvariantCultureIgnoreCase))
{
Response.Cookies[s].Secure = true;
}
}
}
これをglobal.asaxのEndRequestイベントハンドラーに追加すると、すべてのページ呼び出しでこれが発生します。
注:成功した「安全な」割り当て内にbreak;
ステートメントを追加する編集が提案されました。 Cookieの1つのみを保護することを強制し、2番目のCookieは無視されるという考えに基づいて、この編集を拒否しました。カウンターまたはその他のメトリックを追加して、両方がセキュリティで保護されていることを確認し、その時点で中断することは考えられません。
; secure
サフィックスをSet-Cookie
httpヘッダーに追加するには、web.configで<httpCookies>
要素を使用しました。
<system.web>
<httpCookies httpOnlyCookies="true" requireSSL="true" />
</system.web>
Anubhav Goyalの記事のようにコードを書くよりもはるかに便利な私見。
参照: http://msdn.Microsoft.com/en-us/library/ms228262(v = vs.100).aspx
上記のMarcelのソリューションを使用してフォーム認証Cookieを保護するには、「authentication」構成要素も更新してSSLを使用する必要があります。
<authentication mode="Forms">
<forms ... requireSSL="true" />
</authentication>
その他の賢明な認証Cookieはhttpsではありません
参照: http://msdn.Microsoft.com/en-us/library/vstudio/1d3t3c61(v = vs.100).aspx
MSDNブログ「 セッションIDの保護:ASP/ASP.NET 」で推奨されているように、Session_Startでセキュアプロパティを設定するだけで十分であることがわかりました。
protected void Session_Start(Object sender, EventArgs e)
{
SessionStateSection sessionState =
(SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState");
string sidCookieName = sessionState.CookieName;
if (Request.Cookies[sidCookieName] != null)
{
HttpCookie sidCookie = Response.Cookies[sidCookieName];
sidCookie.Value = Session.SessionID;
sidCookie.HttpOnly = true;
sidCookie.Secure = true;
sidCookie.Path = "/";
}
}
@JoelEthertonのソリューションに追加して、新たに見つかったセキュリティの脆弱性を修正します。この脆弱性は、ユーザーがHTTPを要求し、HTTPSにリダイレクトされた場合に発生しますが、HTTPへの最初の要求でsessionid cookieが安全に設定されます。 McAfee Secureによると、これはセキュリティ上の脆弱性です。
このコードは、リクエストがHTTPSを使用している場合にのみCookieを保護します。 HTTPSではない場合、sessionid cookieは期限切れになります。
// this code will mark the forms authentication cookie and the
// session cookie as Secure.
if (Request.IsSecureConnection)
{
if (Response.Cookies.Count > 0)
{
foreach (string s in Response.Cookies.AllKeys)
{
if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid")
{
Response.Cookies[s].Secure = true;
}
}
}
}
else
{
//if not secure, then don't set session cookie
Response.Cookies["asp.net_sessionid"].Value = string.Empty;
Response.Cookies["asp.net_sessionid"].Expires = new DateTime(2018, 01, 01);
}