web-dev-qa-db-ja.com

ASP.NET Web API:401 /無許可の応答を返す正しい方法

OAuth /トークン認証を使用してリクエストを認証するMVC webapiサイトがあります。関連するすべてのコントローラーには適切な属性があり、認証は正常に機能しています。

問題は、すべてのリクエストが属性の範囲内で承認されるわけではないことです-一部の承認チェックはコントローラーメソッドによって呼び出されるコードで実行する必要があります-この場合、401不正な応答を返す正しい方法は何ですか?

throw new HttpException(401, "Unauthorized access");を試しましたが、これを行うと、応答ステータスコードは500になり、スタックトレースも取得します。ロギングDelegatingHandlerでも、応答が401ではなく500であることがわかります。

72

APIメソッドから HttpResponseException ではなく、 HttpException をスローする必要があります。

throw new HttpResponseException(HttpStatusCode.Unauthorized);

または、カスタムメッセージを提供する場合:

var msg = new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "Oops!!!" };
throw new HttpResponseException(msg);
110
LukeH

以下を返すだけです:

return Unauthorized();
72
JohnWrensby

他の回答の代替として、ASP.NETコントローラー内でIActionResultを返す場合にもこのコードを使用できます。

ASP.NET

 return Content(HttpStatusCode.Unauthorized, "My error message");

更新:ASP.NET Core

上記のコードはASP.NET Coreでは機能しません。代わりに次のいずれかを使用できます。

 return StatusCode((int)System.Net.HttpStatusCode.Unauthorized, "My error message");
 return StatusCode(401, "My error message");

どうやら、理由句はかなりオプションです( HTTP応答でReason-Phraseを省略できますか?

12
Alex AIT

何らかのサーバーエラーを示す例外(HttpException)をスローしているため、500応答コードが返されますが、これは間違ったアプローチです。

応答ステータスコードを設定するだけです。

Response.StatusCode = (int)HttpStatusCode.Unauthorized;
7
DGibbs

asp.net core 2.0で次のコードを使用できます。

public IActionResult index()
{
     return new ContentResult() { Content = "My error message", StatusCode = (int)HttpStatusCode.Unauthorized };
}
0
A.R.F