2

ASP.NET メンバーシップ API を使用します。これにより、非アクティブなセッションが自動的にログアウトされます。この自動ログアウトはしたくありません。指定した時間の経過後に ajax でページを呼び出すなど、いくつかの回避策を使用しました。または、セッションをアクティブに保つために iframe メソッドを使用しました。しかし、これは私のニーズにうまく適合しません。このログアウト機能を完全に無効にしたい。

の質問は、この記事への回答でした

セッション タイムアウトの増加が常に機能するとは限らない

一見すると、C# ASP .NET の web.config ファイルでセッション タイムアウト値を大きくすると、問題が解決するはずです。以下の行でタイムアウト値を 60 分に変更すると、ユーザーは 60 分間 Web アプリケーション セッションにログインしたままになると想定できます。

<authentication mode="Forms">
  <forms name="MyAuth" timeout="60" protection="All" loginUrl="~/Web/Login.aspx" slidingExpiration="true" />
</authentication>

<sessionState mode="InProc" cookieless="false" timeout="60" />

しかし、実際にはこれには 2 つの問題があります。最初の問題は、タイムアウト値を 1 時間以上に設定すると、IIS がセッションの間すべてのセッション メモリを保持するため、サーバーに保持されるメモリが過剰になることです。トラフィックの多いサイトで 5 時間のタイムアウト値があり、数千のユーザー セッションのすべてのセッション データを保持しているとします。2 番目の問題は、アプリケーションのテスト時に発生する可能性があります。多くの場合、Web アプリケーションはわずか 15 分後にタイムアウトします。正確には何が起こっているのですか?問題は実際には IIS で設定されたセッション タイムアウトまたは接続タイムアウトのプロパティ (共有ホスティングの場合は、アクセスできない場合もあります) の値である可能性がありますが、セッション タイムアウトを制御する必要があることは明らかです。私たち自身の手。

4

3 に答える 3

2

認証 Cookie を終了しないように設定するのはリスクが高すぎます。

誰でもいつでも、生成された認証済み Cookie を使用して再度ログインできるからです。

詳細については、次の記事を参照してください。FormsAuthentication.SignOut メソッドは、ASP.NET アプリケーションでの Cookie 応答攻撃を防止しません」

いくつかの関連する質問を参照してください。 フォーム認証 - Cookie リプレイ攻撃 - 保護FormsAuthenticationTicket をサーバー側で無効にすることはできません。Cookie 応答攻撃を引き起こす

1 つの解決策は、ハンドラーとそれを呼び出してログイン セッションを時々更新する単純な JavaScript を使用することです。

html/javascript 部分:

<img id="LiveImg" width="1" height="1" alt="" src="keepsessionalive.ashx?" /> 
<script>
var myImg = document.getElementById("LiveImg");
if (myImg){
    window.setInterval(function(){
          myImg.src = myImg.src.replace(/\?.*$/, '?' + Math.random());
        }, 3000);
}
</script>

にはkeepsessionalive.ashx以下を含めることができます。

// 1x1 transparent GIF
private readonly byte[] GifData = {
    0x47, 0x49, 0x46, 0x38, 0x39, 0x61,
    0x01, 0x00, 0x01, 0x00, 0x80, 0xff,
    0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
    0x00, 0x2c, 0x00, 0x00, 0x00, 0x00,
    0x01, 0x00, 0x01, 0x00, 0x00, 0x02,
    0x02, 0x44, 0x01, 0x00, 0x3b
};

public void ProcessRequest (HttpContext context) 
{
    // send the emtpy image
    context.Response.ContentType = "image/gif";
    context.Response.Buffer = false;
    context.Response.OutputStream.Write(GifData, 0, GifData.Length);
}

セッションを維持したい場合は、認証とともにIRequireSessionStateハンドラーで を使用します。

呼び出しごとに認証資格情報が更新され、セッションが維持されます。ユーザーが何らかの理由で Cookie の有効期限が切れると、リプレイ攻撃の可能性を回避できます。

また、この同様の回答で自動画像リロードのトリックを紹介します:
Keeping a related ASP.NET application's session alive from another ASP.NET application
ASP.Net でポストバックを実行せずにセッション タイムアウトをリセット
するasp.net
定義された間隔の後にASP.NET Webページを自動更新しますか?

于 2013-05-27T20:18:53.230 に答える
1

同じことが私たちにも起こりました。その理由は、私たちのサーバーが IIS のタイムアウト (つまり、IIS 要求のタイムアウト) に対処しなければならなかったためです。

だから私たちはこれをしました。(あまり最適ではありませんが、私にとってはうまくいきました。これらすべてを行うためのマスターページがあることを願っています。それ以外の場合は、すべてのページでこれを行う必要があります)

タイムアウトを任意の制限、たとえば 1 日まで増やしたいとします。

1.まず、web.config の値をデフォルト値に増やします。20分。最大値は 1 年です。

2. マスター ページの下部にある空の iframe を実行します。

<iframe id="SessionHandler" src="/html/SessionHandlerHack.aspx" frameborder="no" height="0" width="0"></iframe>

3.ページのコード ビハインドに次のように記述します。

C#

protected void Page_Load(object sender, EventArgs e)
{
    //Session timeout is now at 20 minutes. due to the unreliable nature of session,
    //we are setting the meta-refresh to be 15 minutes to be on safer side.
    Response.AddHeader("Refresh", "900");
}

VB.NET

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    'Session timeout is now at 20 minutes. due to the unreliable nature of session,
    'we are setting the meta-refresh to be 15 minutes to be on safer side.
    Response.AddHeader("Refresh", "900")
End Sub

はい、リフレッシュ ヘッダーを追加するのと同じです。コード ビハインドで変数を使用して 15 分の値を操作しました。はい、

<meta http-equiv="refresh" content="900">

ASPXページ自体は問題ありません。

4.マスター ページで、24 * 60 * 60 * ミリ秒 (つまり 1 日) で期限切れになる JavaScript タイマーを実行します。有効期限が切れると、ユーザーを次のようなログアウト ページにリダイレクトします。

var timeOut = 86400000; //24 x 60 x 60 x 1000 ie, number of milli-seconds in a day
$(document).ready(function () {//window.onload for you maybe?
    window.setTimeout(function () {
        window.location = "/LogIN.aspx?action=logout";
    }, timeOut);
});

ロジックは、タイムアウトにはスライド式の有効期限があり、ページの iframe が 15 分ごとに更新されるため、サイトがタイムアウトにならず、セッションの有効期限が再設定されるというものです。これで、JavaScript タイマーもページ上で実行され、ページ内の iframe で発生した更新を認識せず、目的のタイムアウトのタイムアウト レフリーとして機能します。また、ページが再ロード/ナビゲートされると更新され、タイマーが最初からやり直されます。

初めて聞くには少し多すぎます。しかし、これは私たちにとってはうまくいき、これがこれまでに見つけた唯一の解決策です(毎日研究しているわけではありません:P )

お役に立てれば。ハッピーセッションハッキング!

于 2013-05-27T20:04:02.390 に答える
0

これを web.config に追加します。

<system.web>
<authentication mode="Forms">
      <forms timeout="99999999"/>
</authentication> 
</system.web>
于 2013-05-27T18:06:33.463 に答える