5

Web ページが AJAX を使用して認証チケットの有効期限をサーバーで確認できる Web アプリケーション プロジェクトを実装しようとしています。

私は、slideExpiration でフォーム認証を使用しています。

私が遭遇した問題は、値をリセットせずに値を確認する方法がわからないことです。簡単なページを作成しました - CheckExpiration.aspx - 以下はコードビハインドです:

  private class AjaxResponse
  {
     public bool success;
     public string message;
     public string expirationDateTime;
     public string secondsRemaining;
     public string issueDate;
  }

  protected void Page_Load(object sender, EventArgs e)
  {
     AjaxResponse ar = new AjaxResponse();
     JavaScriptSerializer js = new JavaScriptSerializer();

     if (HttpContext.Current.User.Identity.IsAuthenticated)
     {
        FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
        string expiration = id.Ticket.Expiration.ToString();

        TimeSpan timeRemaining = id.Ticket.Expiration - DateTime.Now;

        ar.success = true;
        ar.expirationDateTime = expiration;
        ar.issueDate = id.Ticket.IssueDate.ToString();
        ar.secondsRemaining = timeRemaining.Minutes.ToString() + ":" + timeRemaining.Seconds.ToString();
     }
     else
     {
        ar.success = false;
        ar.message = "User not authenticated";
     }

     string output = js.Serialize(ar);
     Response.Write(js.Serialize(ar));

  }

このページは、毎秒 ajax を使用してアプリケーションのマスター ページから呼び出します。認証有効期限の中間点を過ぎると、有効期限がリセットされます。

この動作を防ぐにはどうすればよいですか? リクエストのヘッダーでできることはありますか?

4

2 に答える 2

0

CheckExpiration.aspxページを独自のアプリケーションに配置し、これをメインアプリケーションの下の仮想ディレクトリとしてデプロイします。その仮想ディレクトリで、slidingExpiration=falseを構成します。コードはそのまま機能しますが、有効期限が切れるまでの時間の半分を下回ると、チケットは再生成されません。

これが私がそれが機能することを確認するために簡単なローカルプロジェクトでしたことです:

  1. 新しいWebアプリケーションAuthTest4を作成し、パス/AuthTest4でローカルIISサーバーを使用するように構成しました
  2. IISにアクセスし、/ AuthTest4のマシンキー設定を変更して、すべての自動生成/分離オプションのチェックを外し、独自のMachineKeyを生成しました。
  3. 空のWebアプリケーションExpCheckを作成し、CheckExpiration.aspxコードをその中に入れます
  4. 仮想ディレクトリ/AuthTest4/ExpCheckでローカルIISを使用するようにExpCheckWebアプリケーションを構成しました
  5. ExpCheckアプリケーションのweb.configを変更して、以下に示すセクションのみを含めるようにしました

ExpCheckweb.config。他のすべてのセキュリティ設定は、親仮想ディレクトリからカスケードダウンされます。

<system.web>
  <authentication mode="Forms">
   <forms slidingExpiration="false" />
  </authentication>
</system.web>
于 2012-10-15T15:22:00.027 に答える
0

自分で計算するセッション変数として有効期限を保存してみませんか?id.Ticket.Expirationの値を取得する必要があるのは1回だけです。次に、呼び出しごとに、サーバーから値を取得してそれに応じて増分し、サーバーに保存し直します。

http://msdn.microsoft.com/en-us/library/ms178581%28v=vs.85%29.aspx

擬似コード:

if(!Session.KeyExists("Expiration"))
{
  Session["Expiration"] = id.Ticket.Expiration;
}

Session["TimeRemaining"] = Session["Expiration"] - DateTime.Now;

// get all ajaxy here
于 2012-10-11T02:48:35.173 に答える