5

私のWebページでAJAXを使用して認証チケットの有効期限の日時を確認できるWebアプリケーションプロジェクトを実装しようとしています。認証チケットの有効期限が影響を受けることなく確認します

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

私が遭遇する問題は、リセットせずに値をチェックする方法を理解できないことです。 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)); 

    } 

私はアヤックス毎秒を使って自分のアプリケーションでは、マスターページからこのページを呼び出します。認証の有効期限の半分を過ぎると、有効期限がリセットされます。

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

+0

チェックは、これはそれに似たものであるか、あなたの問題であるデフ...のhttp:?//www.dotnetmonster.com/Uwe/Forum.aspx/asp-net-security/2316/problem-with-slidingExpiration – Scorpio

+0

私はあなたがリンクしているこの投稿は、.netのデフォルトの動作に問題がある人だと思います。私はあなたが何かをしようとするまで、あなたがアイドル状態に留まるならあなたがサーバレベルでログアウトしたことを知らないので、その行動を気にしません。私はよりユーザーフレンドリーなものを作ろうとしています。そこでは、あなたがログアウトしようとしていることを知らされます。私はまた、認証が別のタブから更新される可能性があるので、ページを入力するときに設定されたjavascriptタイマーにのみ頼りにしたくありません。 –

答えて

0

自分で計算したセッション変数として有効期限を保存しないのはなぜですか? id.Ticket.Expirationの値を一度取得する必要があります。その後、それぞれの呼び出しは、サーバーから値を取得し、それに応じてインクリメントし、サーバーに保存し直します。

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 
0

独自のアプリケーションであなたのCheckExpiration.aspxページをあなたのメインアプリケーションの下に仮想ディレクトリとしてこれを展開します。その仮想ディレクトリで、slidingExpiration = falseを設定します。あなたのコードはそのままで動作しますが、有効期限まで半分以下になったらチケットを再生成しません。

ここで私はそれが動作することを確認するために迅速なローカルプロジェクトでやったことだ:パス/ AuthTest4で

  1. 新しいWebアプリケーションAuthTest4を作成し、ローカルのIISサーバーを使用するように構成された
  2. は、IISに行き、/AuthTest4のマシンキー設定を変更して、AutoGenerate/Isolateオプションをすべてオフにして、独自のMachineKeyを生成しました。
  3. ExpCheck空のWebアプリケーションを作成し
  4. し、その中にあなたのCheckExpiration.aspxコードを入れ
  5. 設定済みExpCheck Webアプリケーションの仮想ディレクトリ/ AuthTest4/ExpCheckでローカルIISを使用する
  6. は持っているExpCheckアプリケーションのweb.configファイルを変更します以下のセクションのみ

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

<system.web> 
    <authentication mode="Forms"> 
    <forms slidingExpiration="false" /> 
    </authentication> 
</system.web> 
関連する問題