0

asp.net MVC アプリケーションでフォーム認証を使用しており、jquery と ajax を使用してリッチ ユーザー インターフェイスを作成しています。一部のユーザーは、何時間もページを開いたままにする傾向があり、そのログイン セッションは予期したとおりに期限切れになります。ユーザーがリンクをクリックするか、ページをリロードすると、期待どおりにログイン画面が返されます。ボタンをクリックするか、ajax 呼び出しをトリガーすると、ajax 呼び出しは、予期される html または JASON の結果ではなく、ログイン html を返します。その結果、ログイン画面の半分が表示された、壊れたページが表示されます。

すでに多くの ajax 呼び出しをコーディングしているので、デフォルトの .done イベントを拡張またはオーバーライドして、プログラムしたイベントを続行する前にログイン画面のチェックを追加できると考えました。

たとえば、私はこの機能を持っています:

function CallAjax() {
    $.ajax({type: "GET", url: "foo" })
     .done(function (data) { $('#result').val(data); });
}

.done のデフォルトの実装をオーバーライドすることは可能ですか? この関数を書き換えずにチェックしてください。私のチェックでは、おそらく結果がhtml応答であるかどうかを確認するため、「ログイン」を検索してログインページかどうかを確認します。

4

2 に答える 2

0

Phil Haackが説明したthis blog postように、ASP.NETフォーム認証モジュールを拡張して、AJAXで要求されたときにログインページにリダイレクトされなくなり、代わりに401HTTPステータスコードを返すようにすることをお勧めします。.fail次に、コールバックを使用して、401ステータスコードをインターセプトするだけです。この.done場合、ハンドラーは呼び出されません。

于 2012-11-14T14:33:56.943 に答える
0

Darin の提案を試してみましたが、何時間も試した後、自分のセットアップで機能させることができませんでした。しかし、私は初めてうまくいったこのかなり単純な解決策に出くわしました:

これをglobal.asaxに追加するだけです

protected void Application_EndRequest()
{
    var context = new HttpContextWrapper(this.Context);

    if (FormsAuthentication.IsEnabled && 
        context.Response.StatusCode == 302 &&
        context.Request.IsAjaxRequest())
        {
            context.Response.Clear();
            context.Response.StatusCode = 401;
        }
    }
}

http://jvance.com/blog/2012/09/21/FixFormsAuthentication302.xhtmlから取得

于 2012-11-14T17:19:25.730 に答える