質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

2660閲覧

ASP.NET web apiで401(Unauthorized)を返しても302(Found)→200(OKリダイレクト成功後)になってしまう

hallci

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2018/12/13 22:01

前提・実現したいこと

Api Controllerのアクションメソッドの戻り値にreturn Unauthorized();を使用していますが、受け取ったレスポンスが203や200になってしまいます。
401が返るようにしたいです。

実現したいこと

SuppressFormsAuthenticationRedirect プロパティが便利だった件 - ROMANCE DAWN for the new world
上記記事を試しましたが302が返ってきてうまくできませんでした。
その記事にあるように、SuppressFormsAuthenticationRedirectプロパティを使ってうまくさばきたいのですが、その方法がわかりません。

他に試したこと

以下の記事により原因はわかりました。
Using cookie authentication middleware with Web API and 401 response codes | brockallen
Cookie認証ミドルウェアを使用する場合、
サーバー(MVCまたはWebフォーム)が401を発行すると、
レスポンスは(CookieAuthenticationOptionsのLoginPathによって構成された)ログインページへの302リダイレクトに変換されます。

ということだそうで、APIだったとしても.NET Identity側でリダイレクト処理されていることが原因でした。

そのブログポストどおりにやったところ、401が返ってくるようになりました。

ただSuppressFormsAuthenticationRedirectプロパティを使う方法が知りたいのです。

補足情報(FW/ツールのバージョンなど)

VS2013
MVC5.2
WEB API2
.NET Identity 2.0

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ただSuppressFormsAuthenticationRedirectプロパティを使う方法が知りたいのです。

それは、参考にされている記事に <authentication mode="Forms"> と書いてありますように、FormsAuthenticationModule を使用する旧来のフォーム認証でしか使えないはずです。

VS2013 からはデフォルトで ASP.NET Identity を利用しているので、参考にしている記事とは話が違ってきます。

VS2015 + ASP.NET Identity 2 の例ですが、単純に Web API のコントローラーに Authorize 属性を付与すれば(テンプレートで自動生成したコードには付いてます)、

イメージ説明

401 応答が返ってくるはずです。

イメージ説明

投稿2018/12/14 00:49

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hallci

2018/12/14 15:18

お答えいただきありがとうございます。 <authentication mode="Forms"> のことが理解できていませんでした。そうだったのですね… 調査用にAPIにチェックを入れて作成したソリューションで、コメントいただいたようにうまくいっていたコントローラがあったのでよく見てみました。 すると、Startup.Auth.csの中のConfigureAuthメソッドで違いがありました。 (うまくいかない場合) // アプリケーションが Cookie を使用して、サインインしたユーザーの情報を格納できるようにします // また、サードパーティのログイン プロバイダーを使用してログインするユーザーに関する情報を、Cookie を使用して一時的に保存できるようにします // サインイン Cookie の設定 app.UseCookieAuthentication(new CookieAuthenticationOptions { という風に生成されていた部分を、 ↓ (うまくいく場合) // アプリケーションがベアラ トークンを使用してユーザーを認証できるようにします app.UseOAuthBearerTokens(OAuthOptions); に置き換えると、401が返るようになりました。
退会済みユーザー

退会済みユーザー

2018/12/14 22:32

プロジェクトを作るときのテンプレートに何を使ったのですか?
hallci

2018/12/17 03:50

お返事が遅れて申し訳ありません。 同じ環境がなく時間がかかってしまいました。 ■うまくいったプロジェクト WEB APIプロジェクトとして作成(MVCにはチェックが入っており、変更できない) // アプリケーションがベアラ トークンを使用してユーザーを認証できるようにします app.UseOAuthBearerTokens(OAuthOptions); が自動で生成されていました。 ■うまくいかなかったプロジェクト MVCプロジェクトとして作成して、WEB APIにもチェックを入れて作成したソリューション
退会済みユーザー

退会済みユーザー

2018/12/17 04:09

> ■うまくいったプロジェクト > WEB APIプロジェクトとして作成(MVCにはチェックが入っており、変更できない) それが私の回答で画像を示したものだと思います。 であれば、その場合は Web API の認証はクッキーベースではなくトークンベースになります。WebApiConfig.cs に以下のコードがあると思いますが、それがキモです。 config.SuppressDefaultHostAuthentication(); config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); > ■うまくいかなかったプロジェクト > MVCプロジェクトとして作成して、WEB APIにもチェックを入れて作成したソリューション それは自分は試したことがないのですが、MVC も Web API もクッキーベースになっているのではないでしょうか? 参考にされている記事 Using cookie authentication middleware with Web API and 401 response codes | brockallen は MVC も Web API もクッキーベースのようで、その条件で Ajax で Web API を要求された場合のみ 401 を返すようにしていると思います。 (注:クッキーではなくトークンを使う理由はセキュリティ (CSRF) 対策だそうです。MVC アプリではビューに Html ヘルパーの AntiForgeryToken メソッドを、アクションメソッドに [ValidateAntiForgeryToken] 属性を付与して CSRF 対策ができますが、Web API ではそういう手段が使えませんから) で、質問者さんは認証はどのようにしたいのでしょう?
hallci

2018/12/17 05:47 編集

うまくいっていなかったプロジェクトのWebApiConfig.csには // Web API の設定およびサービス // ベアラ トークン認証のみを使用するように、Web API を設定します。 config.SuppressDefaultHostAuthentication(); config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); の記述がありませんでした。 前回のコメントに書いた修正は戻して、WEBAPIのプロジェクトに合わせようとしていますが、 Providerも自動生成されていない、パッケージも足りないなどかなりの違いがありました… 認証については、少なくともWebAPIからはアクセスはトークンでの認証を行いたいです。 いろいろとわからないことが多いのですが、MVCで作成したプロジェクトには app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); という記述があるのですが、WebAPIで作成したプロジェクトにはありません。 このようなところを理解していくには、どこで調べればいいのでしょうか。
退会済みユーザー

退会済みユーザー

2018/12/17 06:20

> いろいろとわからないことが多いのですが、MVCで作成したプロジェクトには > app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); > という記述があるのですが、WebAPIで作成したプロジェクトにはありません。 Web APIテンプレートで作成したプロジェクトではログインする際に ApplicationSignInManager は使わないから無いのだと思います。 ASP.NET Identity に登録済のアカウントの email と password を /Token に送信するとトークンが返ってきます。デフォルトの設定では同時に認証クッキーも発行されるようになっています。以下のスレッドの画像を見てください。 ASP.NET Web APIの認証について https://teratail.com/questions/111286 なお、MVC 側は従来通り ApplicationSignInManager を利用したログインを行い、Web API 側はトークン認証にするということも可能です。 > このようなところを理解していくには、どこで調べればいいのでしょうか。 以下の文書が参考になると思います。 Secure a Web API with Individual Accounts and Local Login in ASP.NET Web API 2.2 https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/individual-accounts-in-web-api
hallci

2018/12/17 08:11

>なお、MVC 側は従来通り ApplicationSignInManager を利用したログインを行い、Web API 側はトークン認証にするということも可能です。 そうなんですね。Startup.Auth.csでいろいろ設定が生成されているのですが、設定の意味がまだ理解しきれていません…API用の設定を追加するだけでいいのでしょうか? >ASP.NET Identity に登録済のアカウントの email と password を /Token に送信するとトークンが返ってきます。デフォルトの設定では同時に認証クッキーも発行されるようになっています。 /Tokenにアクセス成功した場合、 レスポンスヘッダーにクッキーが、ボディにトークンが入っていることを確認しました。 参考記事で勉強させていただきます。ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/12/17 12:29

> そうなんですね。Startup.Auth.csでいろいろ設定が生成されているのですが、設定の意味がまだ理解しきれていません…API用の設定を追加するだけでいいのでしょうか? そう聞かれても簡単に答えられることではないのですが、あえて言えば、MVC のテンプレートで作ったプロジェクトに Web API で作ったプロジェクトの必要な部分を追加していくという感じです。 その話は、表題や最初の質の質問内容と違ってきますので、聞きたいことを整理してから、新たに別のスレッドを立てて質問していただければと思います。
hallci

2018/12/17 18:17

大変助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問