OAuth /トークン認証を使用してリクエストを認証するMVC webapiサイトがあります。関連するすべてのコントローラーには適切な属性があり、認証は正常に機能しています。
問題は、すべてのリクエストが属性の範囲内で承認されるわけではないことです-一部の承認チェックはコントローラーメソッドによって呼び出されるコードで実行する必要があります-この場合、401不正な応答を返す正しい方法は何ですか?
throw new HttpException(401, "Unauthorized access");
を試しましたが、これを行うと、応答ステータスコードは500になり、スタックトレースも取得します。ロギングDelegatingHandlerでも、応答が401ではなく500であることがわかります。
APIメソッドから HttpResponseException
ではなく、 HttpException
をスローする必要があります。
throw new HttpResponseException(HttpStatusCode.Unauthorized);
または、カスタムメッセージを提供する場合:
var msg = new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "Oops!!!" };
throw new HttpResponseException(msg);
以下を返すだけです:
return Unauthorized();
他の回答の代替として、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を省略できますか? )
何らかのサーバーエラーを示す例外(HttpException
)をスローしているため、500応答コードが返されますが、これは間違ったアプローチです。
応答ステータスコードを設定するだけです。
Response.StatusCode = (int)HttpStatusCode.Unauthorized;
asp.net core 2.0で次のコードを使用できます。
public IActionResult index()
{
return new ContentResult() { Content = "My error message", StatusCode = (int)HttpStatusCode.Unauthorized };
}