Как вернуть клиенту RestSharp ошибку аутентификации 401?

В моем контроллере Mvc Api, если пользователь не может быть аутентифицирован, я выбрасываю HttpException 401. Однако клиент RestSharp, похоже, переводит это в код состояния Http 500.

Я хочу иметь возможность генерировать HttpExceptions из моего контроллера Mvc, и чтобы клиент RestSharp сохранял исходную ошибку в своем свойстве StatusCode.

Кроме того, я заметил, что если сервер не работает, когда клиент RestSharp делает запрос, ответ имеет код состояния 0 и код ответа ошибки. Должен ли RestSharp вместо этого возвращать код ошибки 404 http?

Что мне действительно нужно, так это немного документации о том, как RestSharp работает с HttpCodes.

Обновлен кодом в моем контроллере API:

throw new HttpException((int)HttpStatusCode.Unauthorized, AuthenticationError);

person jaffa    schedule 19.01.2012    source источник


Ответы (4)


Вы убедились, что действительно возвращаете 401 клиенту? ASP.NET MVC иногда имеет странную обработку ошибок.

Вместо этого попробуйте вернуть HttpUnauthorizedResult. документ MSDN

person jgauffin    schedule 19.01.2012
comment
Я обновил свой пост с примером кода. Контроллер обслуживает json, поэтому будет ли правильно использовать HttpUnauthorizedResult? Правильно ли я здесь поступаю? - person jaffa; 19.01.2012
comment
Мой ответ все еще актуален. Я считаю более вероятным, что ASP.NET MVC неправильно обрабатывает ваш HttpException (и возвращает 501), чем RestSharp преобразует 401 в 500 - person jgauffin; 19.01.2012
comment
Кажется, тогда это нарушает httpcodes. Я никогда не смогу отобразить пользователю правильные ошибки. Mvc должен отправить правильный 401 обратно клиенту, в данном случае RestSharp. Есть ли способ обойти это? - person jaffa; 20.01.2012
comment
Используйте результат действия HttpUnauthorizedResult из вашего фильтра авторизации (или действия контроллера). Это результат действия, включенный в ASP.NET MVC. - person jgauffin; 20.01.2012
comment
Все еще не повезло с этим, может ли кто-нибудь попытаться воспроизвести эту проблему с помощью ASP.Net MVC и RestSharp. Я поднимаю ошибки http, и они где-то теряются по пути. - person jaffa; 25.01.2012

Я сам смог исследовать этот вопрос. Аутентификация с помощью форм устанавливается в веб-приложении, что означает, что когда HttpUnauthorizedResult возвращается из контроллера, MVC срабатывает и перенаправляет на страницу входа. Это приводит к тому, что клиент полагает, что ошибок не произошло.

Я решил эту проблему, используя пакет nuget aspnet.suppressformsredirect и добавив флаг подавления в ответ для проверки подлинности.

person jaffa    schedule 06.02.2012
comment
Верно, @jaffa, это должен быть принятый ответ для MVC 4. Но насколько плохо то, что нам нужно что-то скачать только для того, чтобы вернуть 401? Нелепый. Мой такой же неудачный обходной путь — отправить 403 Forbidden. (Смотри мой ответ). - person Rap; 07.05.2015

Вот два способа вернуть 401 в MVC.

return new HttpUnauthorizedResult("Unauthorized");

or

return new HttpStatusCodeResult(401);
person Daniel Pamich    schedule 19.10.2016

Хромо, хромо, хромо, что мы должны загрузить пакет NuGet, чтобы вернуть 401! Мой обходной путь - ответить 403 Forbidden с объяснением:

throw new HttpException((int)HttpStatusCode.Forbidden, 
  "Please log in as user " + UserId + " and try again.");

Не семантически правильно, но меньше работы, меньше текущего обслуживания и меньше риска.

person Rap    schedule 07.05.2015