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リクエストが異なる動作をしますか?
あなたのコントローラファクトリが実行しようとしているコードは責任ではありません=>コントローラファクトリはコントローラをインスタンス化し、認証を行わないと想定されています。あなたは '[Authorize]'属性を持っています。 –
@ダーリン - 私はこれを知っています。実際、このコードのすぐ上には、これがハックだとのコメントがあります。 :Dこの事実は、ユーザがログインしていない場合(私たちのIoCコンテナがどのように設定されているかによって)、一部のコントローラを構築できないという事実に起因します。しかし、再び、質問に密接な関係はありません。 :D – Jonas
ここでベストプラクティスが何であるかを言及しています。あなたがそのプラクティスに従わずに問題にぶつからないという事実は私を驚かせるものではありません。これを行う人々と常時起こります:-)だから、ハックを取り除き、正しい方法でやり遂げてください。問題を再現できる完全な例を提供していない場合は、あなたの質問に投稿した3行のコードは、十分に遠いです。 –