6

私の MVC3 プロジェクトには、[Authorize] 属性を持つコントローラーがあります。ユーザーがログインしていない場合、(予想どおり) ログイン画面にリダイレクトする ajax を使用しないフォーム送信があります。

ただし、jquery ajax で送信されたフォームがあり、どうすれば同じことができますか? ユーザーが承認されていない場合、ユーザーをログイン画面にリダイレクトしますか? ログインに成功すると、ユーザーは最初のアクションにリダイレクトされます。

コントローラ

[Authorize]
[ValidateInput(false)] 
public JsonResult SubmitChatMessage(string message)
        {
            if (!string.IsNullOrEmpty(message))
            {
                // Do stuff
            }

            // Return all chat messages
            return GetChatMessages();
        }

クライアント JQUERY

$(document).ready(function () {
    $("form[action$='SubmitChatMessage']").submit(function (event) {
        $.ajax({
            url: $(this).attr("action"),
            type: "post",
            dataType: "json",
            data: $(this).serialize(),
            success: function (response) {
                // do stuff
            }
        });
        return false; 
    });
});

サーバーが返すことをfirebugコンソールウィンドウから見ることができます:

GET http://domain/Account/LogOn?ReturnUrl=%2fProductDetails%2fSubmitChatMessage

あなたの助けを楽しみにしています!

可能な解決策で更新

4

2 に答える 2

6

はい、これは、ASP.NET のフォーム認証について私がいつも嫌っていることの 1 つです。AJAX 認証にはまったく対応していません。401 を処理する IIS をミックスに追加すると、非常に面倒な作業になる可能性があります。

これを行うにはいくつかの方法がありますが、特に「クリーン」な方法はありません。

これらには以下が含まれます:

  1. に対応するコントローラーに ViewBag フラグを設定し、Request.IsAuthenticated認証されていない場合は、送信ボタンのクリック イベントをログイン ページに書き直します。

  2. JsonResult「コード」のプロパティであるAJAX アクションを returnにします。コード 0 は成功、1 は認証されていない、2 はその他のデータの問題などの可能性があります。次に、complete $.ajaxコールバックでそのコードを確認し、ログイン ページにリダイレクトします。

  3. $.ajax jqXHRのステータス コードの応答オブジェクトを確認403し、ログイン ページにリダイレクトします。

  4. 認証ステータスに応じて、通常の送信ボタン、またはログイン ページに移動するアンカー タグのいずれかをレンダリングする、送信ボタン用のカスタム HTML ヘルパーを記述します。

  5. ログインページにリダイレクトするデフォルトの動作 (AJAX リクエストでは発生しません) の代わりに、をチェックRequest.IsAjaxRequest()してカスタム JSON オブジェクトを返すカスタム認証属性を記述します。

于 2011-08-01T23:47:53.857 に答える
0

正直なところ、少し痛いです。私の意見では、Windows Identity Foundation や Azure AppFabric Access Control Service などの Federated Identity を使用している場合はなおさらです。

Ajax 呼び出しはリダイレクトを処理できません。

私の解決策/提案は、Ajax によって呼び出されたコントローラー アクション メソッドを [Authorize] でマークするのではなく、[Authorize] を持つコントローラー アクションからセッション状態に挿入する何らかの値の存在に依存することです (通常はコントローラービューを表示するために呼び出されたアクション メソッド)。ユーザーが認証されていない限り (そしてセッションがタイムアウトしていない限り)、値をセッション状態にすることはできません。この値が存在しない場合は、Ajax メソッドの呼び出しに失敗し、クライアント側のコードで適切に処理できる特定の JSON 結果を返します。

Ajax コントローラー メソッドで [Authorize] を使用すると、奇妙な、しばしば隠れたエラー (更新が消えるなど) が発生します。

于 2011-07-31T18:03:44.807 に答える