2011-07-18 20 views
1

AJAXエンドポイント用のコントローラと認証用のFormsAuthを使用するMVCアプリケーションがあります。GETとPOSTのAjaxリクエストの動作が異なります

私は、GETリクエストが(許可されていないユーザーのための)POSTリクエストとは異なる動作をする興味深いシナリオに遭遇しました。この特定のケースで

、私たちのカスタムControllerFactoryは、このコントローラにアクセスしようとすると、次のコードを実行します:

FormsAuthentication.SignOut(); 
requestContext.HttpContext.Response.Redirect(FormsAuthentication.LoginUrl); 
throw new UnauthorizedAccessException(); 

(私はAJAXリクエスト内でリダイレクトすることは意味がないことを認識しますが、私と一緒にクマ)。

このコントローラーに対してGETリクエスト(AJAX)を実行すると、クライアントは401 - Unauthorized例外を受け取ります。これをクライアント側でトラップしてユーザーをログインページにリダイレクトできます。

このコントローラにPOSTリクエスト(AJAX)を実行すると、302が取得され、リクエストが自分のログインページにリダイレクトされました。

なぜGETリクエストとPOSTリクエストが異なる動作をしますか?

+2

あなたのコントローラファクトリが実行しようとしているコードは責任ではありません=>コントローラファクトリはコントローラをインスタンス化し、認証を行わないと想定されています。あなたは '[Authorize]'属性を持っています。 –

+0

@ダーリン - 私はこれを知っています。実際、このコードのすぐ上には、これがハックだとのコメントがあります。 :Dこの事実は、ユーザがログインしていない場合(私たちのIoCコンテナがどのように設定されているかによって)、一部のコントローラを構築できないという事実に起因します。しかし、再び、質問に密接な関係はありません。 :D – Jonas

+0

ここでベストプラクティスが何であるかを言及しています。あなたがそのプラクティスに従わずに問題にぶつからないという事実は私を驚かせるものではありません。これを行う人々と常時起こります:-)だから、ハックを取り除き、正しい方法でやり遂げてください。問題を再現できる完全な例を提供していない場合は、あなたの質問に投稿した3行のコードは、十分に遠いです。 –

答えて

1

私はDarinのアドバイスを受け取り、リファクタリングを行いました。この問題はもう解決しません。 :)私は私の問題の根本を発見しました.IASFilter属性を持たないMVCエラー処理の属性があるため、非決定的な順序で何かが起きていました。お尻を助けてくれてありがとう。 ;)

関連する問題