3

ASP.NET フォーム認証の背後にあるフォームがあります。これまでのところ、実装は典型的な「すぐに使える」タイプの構成に従います。

1 つのページで、ユーザーはメッセージを投稿できます。ユーザーがメッセージを作成するためにそのページに長時間座っていると、認証セッションの有効期限を過ぎて実行される場合があります。その場合、投稿は記録されず、ログイン ページにリダイレクトされるだけです。

長いメッセージが失われるという苛立たしい出来事を防ぐには、どのようなアプローチを取るべきですか?

明らかに、認証セッションを非常に長くすることもできますが、システムにはそのアプローチを思いとどまらせる他の要因があります。 この特定のページを例外として、ポストバックである限りログインにリダイレクトされないようにする方法はありますか?

4

4 に答える 4

1

私の同僚は、HttpModule を使用して、この種の問題に対する一般的な解決策を考え出しました。

彼は、この特定のアプリケーションで独自の認証を処理することにしたことに注意してください。

ここに行きます:

彼は、ユーザーがログインしなくなったことを検出する HttpModule を作成しました。ユーザーがログインしなくなった場合、そのページの ViewState とすべてのフォーム変数を取得し、コレクションに保存しました。その後、ユーザーはログイン ページにリダイレクトされ、前のページのフォーム変数と ViewState 情報が隠しフィールドにエンコードされます。

ユーザーが正常に再認証されると、非表示フィールドのチェックが行われます。その非表示フィールドが使用可能な場合、HTML フォームに古い投稿のフォーム変数とビューステートが取り込まれます。次に、Javascript を使用して、このフォームをサーバーに自動送信しました。

于 2008-11-14T18:03:28.203 に答える
1

この関連する質問を参照してください。回答はすべて、ログイン後に値を保持するという同じ概念に関するほとんどのテーマです。

  • ログインページは、ユーザー名、パスワード、および以前の POST 変数を参照ページに投稿します。参照ページはユーザーにログインし、アクションを実行します。
  • ログインページはフォーム変数を書き出し、ログインに成功するとJavascriptが参照ページに送信されます
  • AJAX ログイン

POST 時にログインしているかどうかを気にしない場合 (セキュリティ的には少し不安に思えます...)、IHttpModule で HttpContext.PostAuthenticateRequest をフックすると、FormsAuthentication.SetAuthCookie を使用して再ログインする機会が得られます。 . FormsAuthenticationModule.Authenticate イベントは、HttpContext.User を設定することで同様に使用できます。

// Global.asax
void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs e) {
   // check for postback somehow
   if (Request.Url == "MyPage.aspx" && Request.Form["MySuperSecret"] == "123") {
      e.User = new GenericPrincipal(new GenericIdentity(), new string[] { });
   }
}
于 2008-11-14T19:02:08.473 に答える
0

ユーザー ID の代わりにリモート IP で識別されるフォーム値をデータベースに追加することで、これを一度処理しました。

( HttpContext.Request.UserHostAddress )

次に、ログイン後、現在のユーザーの IP アドレスがデータベースに行があるかどうかを確認し、必要なアクションを実行できます。

マイケル

于 2008-11-16T14:58:30.850 に答える
0

セッション タイムアウトが発生すると、ユーザーのセッション (およびページ情報) が破棄されます。これは、最終的なポストバックが失敗することを意味します。他の人が示唆しているように、いくつかの回避策がありますが、それらはすべて、その特定のページで認証とセキュリティを気にしないことを前提としています.

Ajax を使用して 10 分ごとにサイレント モードでポストバックすることをお勧めします。Web 構成でページ固有のセクションを作成して、そこに長いタイムアウトを含めることができます。

于 2008-11-16T07:46:31.723 に答える