2012/03お楽しみはこれからだ!2012年3月2日金曜日ApiControllerで認証する際にログインページにリダイレクトしたくない@jsakamotoさんへそりゃそーですね!Apiなんだから。FormsAuthenticationの認証チケットを利用してWCFでもForm認証を使う、っていう話が前にありましたが、それはそれで王道なやり方じゃない、ですよね。APIとして認証するならOAuthとかなんでしょうかね。その場合の受けはHttpMessageHandler使ってやればいいのかな。いえ今回は受けじゃなくてレスポンスのですしたね。普通にAuthorize属性使うと401になるから問題無さそうだけど、MVC(WebFormsでも一緒)アプリケーションに組み込んだ場合、Form認証も入ってたりするはずなので、FormsAuthenticationModuleに途中でレスポンスコードを横取りされた結果、ログインページへのリダイレクト(302)になってしまう。なると、クライアントがブラウザならいいけど、APIを呼び出してるプログラムだったら、そんな~、ログインページとか困ります~、です。APIの標準テンプレートを使った場合に、以下のようにHomeControllerとValuesControllerを書き換えたとします。};}::}ログインページは以下のように変更。/>そうするとApiControllerにAuthorizeつけてブラウザでアクセスすると「ログインしてね!」が表示されます。ステータスコードは302のあとページ表示で200。コラー!なので、FormsAuthenticationModuleに書き換えられたステータスをカスタムモジュールで再度書き換えました。Web.configもモジュール使うようにしましょう。</system.webServer>そうすると、どーなるかっていうと。ステータスは401で中身なしになりました。用意しといたAuthorize属性のついた/home/accessdeniedにアクセスすると。Form認証と同じ挙動ですね。ログインページにリダイレクト。FormsAuthenticationModuleが仕込まれてると、これはもうHttpHandlerの実行タイミングじゃどうにもならないのtで、こういうやり方になると思います。標準で用意されてる認証モジュールって共存出来ないし。ApiControllerはHttpControllerHandlerから実行されるので、実質HttpHandlerですよね。途中でMessageをいじるっていうのはそこに対するAOP的な動作。それほどコードを書くわけでも無いので、コレでいいかなーって思いますが、いかがでしょーか?後は、素直に別サイトにしてしまう、とか...。