Cookieを使用してASP MVCにセッションを保存する
-
22-07-2019 - |
質問
セッション全体をCookieに保存することは、ここ数年Railsの標準でした-ASP MVCで同様のことを達成する簡単な方法はありますか?
デフォルトでは、Session / TempDataのすべてのものがサーバーのメモリに保存されます。 web.configでは、これをSQLストア/サーバー側キャッシュに変更できます。これらのオブジェクトをCookieに保持できるようにしたいです。
カスタムSession-State Store Providerを実装できるようです。より簡単なアプローチはありますか?
解決
はい、カスタムステートセッションプロバイダーを実装します。いいえ、簡単なアプローチはありません。
見た目ほど悪くない、つまり> odbcサンプルの半分がdbに書き込んでいます。
他のヒント
セッションID(ハッシュなど)をCookieに保存し、そのIDを使用してメモリ/データベース/任意のストレージからセッションデータを取得する方がはるかに効率的だと思います。完全なセッション状態をCookieに保持すると、帯域幅が不必要に増加します。
また、セキュリティを念頭に置いてください:Cookieに認証情報またはその他の機密データが含まれていて注意しない場合、ユーザーが簡単にハッキングして特権を取得したり、アプリケーションを混乱させたりする可能性があります(データの暗号化も吸う、暗号化されたデータをbase-64でエンコードする必要があるため、帯域幅と処理時間がさらに無駄になります)。ユーザーからの入力を信頼しないでください 。
セッション全体をクッキーに保存することは強くお勧めしません。パフォーマンスに悪い影響があります。これを考慮してください:(すべてのリソースへの)すべてのリクエストには、1回か2回だけ必要な古いデータのオーバーヘッドが含まれます。最終的に、このオーバーヘッドはユーザー、帯域幅、サイトのパフォーマンスに影響を与えます。
例を次に示します。
GET / HTTP/1.1
Host: localhost
OtherUsefulHeaders: foo
Cookie: YourSessionState=...
初期リクエストサイズは約200バイトです。たとえば、セッションに約100バイトを追加するとします。現在、サイズは300バイトで、オーバーヘッドは約30%です。さらに100バイトを追加すると、オーバーヘッドは50%です。つまり、リクエストを送信するのにおよそ2倍の時間と2倍の帯域幅が必要です。
CookieベースのTempData実装。フットプリントがはるかに小さく、実際に意味があります。
(セッション全体ではなく)Cookieに TempData
を保存することをお勧めします。
TempData
をCookieに保存するには、 ITempDataProvider
をオーバーライドし、独自のカスタムプロバイダーを実装する必要があります。
実際には、利用可能なnugetパッケージがあります(このカスタム実装は自動的に行われます): BrockAllen.CookieTempData およびこちらのドキュメント。このパッケージの良い点は、 TempData
を圧縮および暗号化することです。したがって、インターネット経由でプレーンテキストを送信することを心配する必要はありません。
する必要があるのは、nugetパッケージをインストールし、 ControllerBase
クラスの CreateTempDataProvider
をオーバーライドすることだけです。
using BrockAllen.CookieTempData;
namespace myProject.web.Controllers
{
public class ControllerBase : Controller
{
// use CookieTempDataProvider instead of default provider
protected override ITempDataProvider CreateTempDataProvider()
{
return new CookieTempDataProvider();
}
}
}
これにはセッションを使用しないでください。代わりにプロファイルを使用してください。プロファイルはCookieを使用してコンピューターをプロファイルなどに一致させます。プロファイルキーはCookieに保存され、ブラウザーなどを閉じても失われません。
Cookieに保存するデータの種類によって異なります。文字列のみを保存する場合は、次のコードを実行します。
HttpCookie cookie = new HttpCookie("username","sth");
cookie.HttpOnly = true;
cookie.Expires = DateTime.Now.AddMonths(3);
HttpContext.Current.Response.Cookies.Add(cookie);