2011-01-21 3 views
3

コンテキストの場合、フォーム認証タイムアウト値がweb.configに設定されていて、ASP.NET MVC 1を使用しています。 2ユースケースとして、私の問題を述べる - 認証タイムアウトなしで何が起こるか最初のもの、および認証タイムアウトと何が起こるか第二1:.NET C#:AJAX呼び出し中にフォーム認証の有効期限を処理する方法

ノーマルケースを:

アプリにログインすると、認証タイマーが点滅を開始します。認証期間はまだ有効ですが、ユーザーはAJAX呼び出しをトリガーするページ上の何かを(jQueryを通して)クリックします。サーバーにヒットしてリクエストを処理し、部分的なビューをユーザーに返します(ActionResult)。 htmlはAjaxの成功メソッドの文字列として渡され、このhtmlをとりページのdivに挿入します。これはすべて予想されます。

は、ケースをタイムアウトしました:

は、ユーザーがアプリにログインすると、認証タイマーが刻々と過ぎて開始します。 x時間後に、認証期間が終了します。有効期限が切れると、ユーザーは(jQueryを使用して)AJAX呼び出しをトリガーするページ上の何かをクリックします。我々はサーバーにヒットしましたが、認証チケットは期限切れです。 .NETはタイムアウト期間を設定する同じweb.config要素に定義されたloginURL値に自動的にリダイレクトします。私にとって、このページはユーザがログインするためのユーザ名/パスワードを入力するように要求されるログインページです。したがって、Home/Loginコントローラアクションが実行され、最終的にajaxの成功へのhtmlの文字列として完全な(部分的ではない)方法。これは、私がフルページのhtml(<html>タグを付けて)を取り、それをページのdivに挿入しようとしているため、ページが爆弾になる原因となります。

だから私の問題があります。認証期間が終了し、.NETがログインページにリダイレクトされると、全ページのHTMLをajaxの成功メソッドに戻してしまいます。もちろん、サーバーのヒットがAJAXコールでない場合は、すべて正常に動作します。ログインページに正しくリダイレ​​クトされます。しかし、私はこのケースをどうすれば処理できますか?誰にもアイデアはありますか?

ありがとうございました。

答えて

0

ので、アカウント/ログインアクション取得のチケットが

public Action Login() 
{ 
    if(Request.IsAjaxRequest()) 
    return Content(@"<meta http-equiv="refresh" content="1" />"); 
    //if it is ajax request the div will be filled with this meta tag which will refresh the page 


    return View(); 
} 
+0

返信いただきありがとうございます。残念ながら、.NETがログインページにリダイレクトするまでに、Request.IsAjaxRequest()はfalseを返します。 .NETが認証がタイムアウトしたことを認識し、 'loginURL'を打つことを決定すると、おそらく新しいリクエストが生成されます。 –

+0

@Mega Mattおそらくあなたがmvc1を使っているからでしょう。 jQueryで作成されたすべてのAJAX呼び出しには、AJAXであることを示すヘッダーが追加されます。チェックするヘッダーはX-Requested-Withで、値はAJAX呼び出しの場合XMLHttpRequestになります。デバッグを試して、Request.Headers ["X-Requested-With"]を探してください。 – Omu

+0

Request.Headersに「X-Requested-With」がありません。 「接続」、「キープアライブ」、「受け入れる」、「受け入れる - 文字セット」、「受け入れエンコーディング」、「受け入れ言語」、「Cookie」、「ホスト」、「参照者」、エージェント"。正直なところ、Request.IsAjaxRequest()がfalseを返していた場合、AJAXリクエストに関連するヘッダーがあるとは思っていませんでした。私はMVC 1を使ってこのことがまだ私に関係していると思いますか? –

0
public class BasicAuthenticationAttribute : ActionFilterAttribute, IAuthenticationFilter 
{ 
    public void OnAuthentication(AuthenticationContext filterContext) 
    { 
     var user = filterContext.HttpContext.User; 
     if (user == null || !user.Identity.IsAuthenticated) 
     { 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       filterContext.Result = new JsonResult 
       { 
        JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
        Data = new { redirectTo = FormsAuthentication.LoginUrl } 
       }; 
      } 
      else 
      { 
       filterContext.Result = new HttpUnauthorizedResult(); 
      } 
     } 
    } 
    public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext) 
    { 
     // throw new NotImplementedException(); 
    } 
} 

を満了したときに実行して、あなたが道

$.get('/foo', function(result) { 
if (result.redirectTo) { 
    window.location.href = result.redirectTo; 
} else { 
    // standard stuff 
} 

})以下で使用することができます。

関連する問題