Подтвердить что ты не робот

ASP.NET Web API: правильный способ возврата 401/несанкционированного ответа

У меня есть сайт webapi MVC, который использует аутентификацию OAuth/токена для аутентификации запросов. Все соответствующие контроллеры имеют нужные атрибуты, а проверка подлинности работает нормально.

Проблема заключается в том, что не весь запрос может быть разрешен в области атрибута - некоторые проверки авторизации должны выполняться в коде, который вызывается методами контроллера, - что является правильным способом вернуть 401 несанкционированный ответ в этот случай?

Я пробовал throw new HttpException(401, "Unauthorized access");, но когда я делаю это, код статуса ответа - 500, и я получаю также трассировку стека. Даже в нашем logging DelegatingHandler мы видим, что ответ 500, а не 401.

4b9b3361

Ответ 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() получить его.