2009-05-19 15 views
12

は、私は同じようFormsAuthenticationを使用してASP.NETのWebサイトおよび構成で標準のセッションの仕組みを構築しています:フォーム認証CookieとAsp.Netセッションの存続期間を同期する方法は?

<authentication mode="Forms"> 
    <forms cookieless="UseCookies" name=".MyAppAuth" loginUrl="~\Login.aspx" timeout="20"/> 
</authentication> 
... 
<sessionState timeout="20" cookieless="UseCookies" /> 

認証Cookieの有効期間は、ユーザーセッションの寿命に等しくないと思われます。 だからASP.NETは

  • セッションは、ユーザのログアウト前に終了していない、ときに、ユーザーのログアウト

    1. セッションが終了することを保証するものではありません。

    FormsAuthenticationまたはセッションステートメカニズムをカスタマイズしてこれらの目標を達成する方法はありますか?

  • 答えて

    6

    実際には、セッションを維持するよりも長い間ユーザーをログインさせ続ける必要があるため、組み込みのメカニズムはありません。また、セッションは記憶域を保証するものではなく、セッション中のデータへの依存を避ける必要があります。

    認証Cookieの有効期限が切れたときにサーバー上で何も起こりません。追跡された状態はありません。

    「ログアウト」リンクがあり、ハンドラにはAbandonのセッションがあり、FormsAuthenticationからはSignOutですが、強制的にユーザがウェブサイトからログアウトすることはありません。

    セッションが好きな人もいますが、その使用が虐待されているためにほとんどの人は嫌われたり嫌になる人がいます。主な理由は、セッションの過度使用がサーバーのパフォーマンスの低下の原因となる傾向があり、不正なセッションの使用により、拡大縮小されないWebサイトが作成される可能性があります。

    可能であればSessionの使用を避け、使用する必要がある場合は、MSDNの記事Improving ASP.NET Performanceの推奨事項に従ってください。 Understanding session state modes + FAQもご覧ください。特にQ:Session_Endはなぜ起動されませんか?

    9

    私はこの質問を何度も聞いたことがありますが、私の答えは通常「なぜあなたはこれを望んでいますか?」です。 1つは他のものを必要とせず、それらの有効期限は異なる基準を用いて決定されるべきである。

    セッション状態では、ユーザーがログインする必要はありません。アプリはセッション状態を使用するために認証を使用する必要もありません。ユーザーが既にログインしていてもセッション状態を使用していて、ログアウト後もセッション状態を使用しているWebアプリケーションを作成することができます。ここでの「セッション」とは、クライアント(ウェブブラウザ)がサイトに接続し、数ページを飛び越えて去ったときである。ユーザーがログインしているかどうかは関係ありません。ブラウザを閉じて新しいブラウザを開いてサイトに戻ると、新しいセッションが作成されます。しかし、サーバーは古いブラウザウィンドウを閉じたことを知らないので、元のセッションはまだ存在します。スケーラビリティ(主にメモリ)を目的として、セッションを終了し、メモリとセッショントラッキングリソースを解放します。クライアントが新しいリクエストを作成するのに時間がかかりすぎると、新しいリクエストによって新しいセッションが作成されます。

    一方、認証を使用してセッション状態をまったく使用することはできません。私は通常、セッション状態とビューステートの両方を無効にしてアプリケーションを起動し、本当に必要な場合にのみ有効にし、ページ単位(またはviewstateのコントロールごとに)で有効にします。

    セッションの有効期限は、各セッションで使用されるメモリ、Webサーバーで使用可能なメモリ、同時ユーザー数、およびその他のスケーラビリティのニーズによって決まります。それは通常、数分から1時間の範囲内である。

    認証はクライアント上でクッキーとして維持され、基本的にサーバーのリソースを消費しません。スケーラビリティに基づいたログインの有効期限は、通常、セッションの有効期限よりも長くなる可能性があります。実際には、ユーザーは無期限にログインしておくことができます。認証の有効期限を短く保つと、通常はセキュリティ上の理由からです。自分のコンピュータから離れて15分移動した場合、あなたの銀行のWebサイトアカウントを誰かが利用できるようにしたくないでしょうか?あなたはGmailやFacebookにログインして「私を覚えている」を選択し、数日後に返信すると、がまだになります。もちろん、いくつかのセッション情報を保持するWebアプリケーションがないため、これは新しいセッションになります日々。

    今、多くの人が同じ長さの認証とセッションの有効期限を使用していることがわかりました。また、多くの場合、ユーザーがログアウトしたときのセッションを放棄()またはクリア()します。しかし、彼らはまだは、ユーザーがまだログインしているが、セッションが期限切れの場合(次の要求で新しい空のセッションを作成する)、またはユーザーの認証が期限切れでセッション(再度ログインする必要がありますが、期限切れではない古いセッションを別のユーザーの機密データで持ち歩かなければならない)。どのようなタイムアウトを最終的にアプリケーションに適用しても、これらのケースを処理することは非常に重要です。

    4

    私はこの質問を自分自身にしばしば尋ねる理由は、「期限切れの」セッションオブジェクトにアクセスしないようにするためです。 セッションがログインの有効期限前に期限切れになり、ユーザーがセッションのデータを使用するページを要求すると、厄介なnull参照例外が発生します。

    このarticleが役に立ちます。有効期限が切れたセッションを検出し、その旨をユーザーに知らせるためのいくつかのソリューションについて説明します。

    関連する問題