8

jQuert .ajax 関数を使用してページ メソッドを呼び出しています。サイトは FormsAuthentication を使用しています。そのため、認証チケットの有効期限が切れると、ページ メソッドへの呼び出しによって明らかにログイン ページへのリダイレクトが発生します。

さて、System.Web.Handlers.ScriptModule を作成した天才たちは、何らかの理由で JavaScript からのページ メソッドまたは Web サービス メソッドへの REST スタイル呼び出しが 302 リダイレクトを引き起こした場合、単純に401 Unauthorized への応答。これにより、フォーム認証が使用されているため、ユーザーがユーザー名とパスワードを入力しようとすると、まったく意味のないログイン UI がブラウザにポップアップ表示されます。最後に、ユーザーが [キャンセル] をクリックすると、401 がエラー ハンドラーに渡されます。

問題は、ブラウザのログイン UI プロンプトを何らかの方法で無効にするにはどうすればよいかということです。Web 上の一部の人々は、XHR 要求でユーザー名とパスワードを使用することを提案していますが、うまくいかないようです。

4

3 に答える 3

5

私はそれを回避したと思います。もちろん、内部のMS AJAX関連のエラーに依存することはあまり良いことではありませんが、これはこの問題に直面している他の人にとってはトリックになります。

基本的には、X-MicrosoftAjaxヘッダーを値Delta = trueに設定します(ここでは大文字と小文字が区別されます)。ScriptModuleはこれを通常のリダイレクトとして解釈し、応答を200に変換しますが、 pageRedirectデータを設定します。消費するページ上の任意のScriptManager(MS-AJAX PageRequestManager)の文字列。jQuery.ajax関数は引き続きこれをエラーと見なすため、基本的にXHRのresponseTextプロパティでpageRedirectをチェックし、それに応じて処理することができます。何かのログインページにユーザーを送るようなものです。

    $.ajax({
            type: "POST",
            url: postUrl + "/SomePageMethod",
            data: "{searchString:\"" + escape(searchString) + "\"}",
            contentType: "application/json; charset=utf-8",
            beforeSend: function(xhr) {
                xhr.setRequestHeader("X-MicrosoftAjax","Delta=true");
            },
            dataType: "json",
            success: onSuccess,
            error: onError
        });

function onError(xhr, e, textStatus) {
    var isAjaxRedirect = xhr.status == 200 && xhr.responseText.match(/pageRedirect/);
    if (isAjaxRedirect == "pageRedirect") {
        // forms authentication ticket expired
        location.href = "a session timeout page, or a login page or whatever";
    }
}
于 2008-12-12T00:39:22.977 に答える
2

これは IIS で無効にできます。以下で説明する詳細は IIS6 のものですが、IIS7 以降の関連項目を見つけるのは難しくありません。

  1. 関連するサイトを見つけます。
  2. [ディレクトリ セキュリティ] タブ、または IIS のバージョンの関連するタブを開きます。
  3. 「認証とアクセス制御」セクション内の「編集」をクリックします
  4. 「統合Windows認証」のチェックを外す

ブラウザにポップアップが表示されなくなり、必要に応じて正しいステータス コードを返すことができるようになります。

于 2012-03-23T10:02:40.867 に答える
1

どちらも素晴らしい答えです。ただし、Web サイトが共有サーバーでホストされている場合は、IIS の設定を変更できない可能性が高いため、クライアント側のソリューションは効果的です。私は同じ問題に直面しており、この投稿は私を救います. 解決策に対する私の 2 セント: jquery (少なくとも最新バージョンでは) では、「header」というパラメーターを使用して、「beforeSend」コールバックを使用せずにこのヘッダーを送信できます。同じ。ここに他のヘッダー情報を追加することもできます。

$.ajax({
            type: "POST",
            url: postUrl + "/SomePageMethod",
            data: "{searchString:\"" + escape(searchString) + "\"}",
            contentType: "application/json; charset=utf-8",
        headers: { "cache-control": "no-cache", "X-MicrosoftAjax" : "Delta=true" },
            dataType: "json",
            success: onSuccess,
            error: onError
        });

このヘッダー「Delta=true」のことを知らなかったので、ちょっと調べてみると、自分が行っているリクエストが非同期ポストバックリクエストであることをサーバーに伝えるためのヘッダーのようです。

AJAX 呼び出しは、"エラー" コールバックで HTTP ステータス 200 ("Unauthorized" 401 ではなく) を返します。これは、サーバー要求が何らかの方法で成功したことを意味します (認証は失敗します)。少し奇妙ですが、それが機能する方法です。

お役に立てれば。

于 2014-04-12T07:47:37.300 に答える