ASP.NET Web API: правильный способ возврата 401/несанкционированного ответа
У меня есть сайт webapi MVC, который использует аутентификацию OAuth/токена для аутентификации запросов. Все соответствующие контроллеры имеют нужные атрибуты, а проверка подлинности работает нормально.
Проблема заключается в том, что не весь запрос может быть разрешен в области атрибута - некоторые проверки авторизации должны выполняться в коде, который вызывается методами контроллера, - что является правильным способом вернуть 401 несанкционированный ответ в этот случай?
Я пробовал throw new HttpException(401, "Unauthorized access");
, но когда я делаю это, код статуса ответа - 500, и я получаю также трассировку стека. Даже в нашем logging DelegatingHandler мы видим, что ответ 500, а не 401.
Ответы
Ответ 1
Вы должны выбросить HttpResponseException
из своего метода API, а не HttpException
:
throw new HttpResponseException(HttpStatusCode.Unauthorized);
Или, если вы хотите предоставить настраиваемое сообщение:
var msg = new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "Oops!!!" };
throw new HttpResponseException(msg);
Ответ 2
Просто верните следующее:
return Unauthorized();
Ответ 3
В качестве альтернативы другим ответам, вы также можете использовать этот код, если хотите вернуть IActionResult
в контроллере ASP.NET.
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?)
Ответ 4
Вы получаете код ответа 500, потому что вы выбрасываете исключение (HttpException
), которое указывает на какую-либо ошибку сервера, это неправильный подход.
Просто установите код состояния ответа .e.g
Response.StatusCode = (int)HttpStatusCode.Unauthorized;
Ответ 5
Вы можете использовать следующий код в asp.net core 2.0:
public IActionResult index()
{
return new ContentResult() { Content = "My error message", StatusCode = (int)HttpStatusCode.Unauthorized };
}
Ответ 6
Чтобы добавить существующий ответ в ASP.NET Core> = 1.0, вы можете
return Unauthorized();
return Unauthorized(object value);
Чтобы передать информацию клиенту, вы можете позвонить так:
return Unauthorized(new { Ok = false, Code = Constants.INVALID_CREDENTIALS, ...});
На клиенте, кроме ответа 401, у вас также будут переданные данные. Например, на большинстве клиентов вы можете await response.json()
получить его.