4

編集:問題は最初のコードだけに関係するものではなかったため、関連のないコード/説明を削除しました。

多くの Ajax 呼び出し (jqGrid など) とフォーム認証を使用する MVC3 ベースのアプリケーションがあります。また、ほとんどの場合、Ajax で呼び出す特定のコントローラー/アクションで [Authorize] 属性を使用します。「このページは適切にリダイレクトされていません」または「このページにはリダイレクト ループがあります」というエラーが表示されることがよくあります。

これをフィドラーでチェックアウトしました。ユーザーとしてログインし、認証が必要なページにアクセスしようとすると、アカウント/ログオンにリダイレクトされ、無限ループに陥ることがあります。これは通常、Ajax 呼び出しで Authorize 属性を持つコントローラー/アクションを呼び出しているときに発生します。アプリケーションは、アカウント/ログオンに 302 リダイレクトを送信しているようです。アカウント/ログオンの呼び出しは、それ自体にリダイレクトされるようです。また、Fiddler の textView は次のように表示されます。

<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/Account/LogOn">here</a>.</h2>
</body></html>

Global.asax ファイルに次のものがあります

protected void Application_EndRequest()
        {
            var context = new HttpContextWrapper(this.Context);
            //if we are an ajax request and forms authentication caused a 302, then we actually need to do a 401
            if (System.Web.Security.FormsAuthentication.IsEnabled && context.Response.StatusCode == 302 && context.Request.IsAjaxRequest())
            {
                context.Response.Clear();
                context.Response.StatusCode = 401; 
            }
        }

そして、これは私のメインのレイアウトページにあります

<script type="text/javascript">
    $(document).ajaxError(function (xhr, props) {
        if (props.status == 401) {                
            location.reload();
        }
    });

</script>

フォーム認証の web.config 設定にはこれがあります

<authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880"/>
    </authentication>

リダイレクトは頻繁に開始され、同じコントローラー/アクションでもありません。かなりランダムに見えます。ユーザーの Cookie の有効期限が切れていて、何らかの理由でこの問題を引き起こしているのか、それともアプリケーション プールのリサイクルの問題なのかはわかりません。これを回避する方法についての提案は大歓迎です。ここ数日、これに苦労しているので、専門家からの助けは素晴らしいものになるでしょう. ありがとうございました

4

3 に答える 3

1

アクションメソッドをAuthorize属性で装飾して、認証済み/ログイン済みのユーザーが利用できるようにし、その後、ユーザーの役割を確認します。

于 2013-10-06T18:04:05.923 に答える
1

上記のコードにループはありません。しかし、controller1 または controller2 のいずれかで、この home/index アクションにリダイレクトされる可能性があります。

サイトのテスト中にフィドラーを実行することをお勧めします。リダイレクト ループが発生した場合は、そこで簡単に検出でき、コードの問題点を簡単に見つけることができます。

于 2013-10-07T20:23:59.773 に答える