У меня есть сайт MVC webapi, который использует аутентификацию OAuth / токена для аутентификации запросов. Все соответствующие контроллеры имеют правильные атрибуты, и аутентификация работает нормально.
Проблема в том, что не весь запрос может быть авторизован в области действия атрибута - некоторые проверки авторизации должны выполняться в коде, который вызывается методами контроллера - каков правильный способ вернуть несанкционированный ответ 401 в этом случае?
Я пробовал throw new HttpException(401, "Unauthorized access");
, но когда я это делаю, код состояния ответа - 500, и я также получаю трассировку стека. Даже в нашем журнале DelegatingHandler мы видим, что ответ - 500, а не 401.
c#
asp.net-mvc
authorization
GoatInTheMachine
источник
источник
HttpResponseException
когда возвращатьUnauthorized()
. Использование исключения для «ожидаемой» ошибки - это своего рода антишаблон, поэтому, если есть случаи, когда вы ожидаете, что вызов совершит эту ошибку, возвратUnauthorized()
, вероятно, будет правильным вызовом. За исключениемHttpResponseException
действительно неожиданного.Ответы:
Вы должны выбросить
HttpResponseException
из своего метода API, а неHttpException
:Или, если вы хотите предоставить собственное сообщение:
источник
Просто верните следующее:
источник
return Content<string>(HttpStatusCode.Unauthorized, "Message");
для этого.В качестве альтернативы другим ответам вы также можете использовать этот код, если хотите вернуть
IActionResult
в контроллере ASP.NET.ASP.NET
Обновление: ASP.NET Core
Приведенный выше код не работает в ASP.NET Core, вместо этого вы можете использовать один из них:
Очевидно, фраза причины довольно необязательна ( может ли HTTP-ответ опустить фразу причины? )
источник
ControllerBase
класс (используемый ASP.NET Core WebAPI) больше не имеетContent
перегрузки, которая принимает код состояния HTTP.HttpStatusCode.Unauthorized
), а не 200.Content(...)
просто сокращение для возврата любого заданного содержимого с заданным кодом состояния HTTP. Если вы хотите отправить 200, вы можете использоватьOk(...)
Вы получаете код ответа 500, потому что вы генерируете исключение (
HttpException
), которое указывает на какую-то ошибку сервера, это неправильный подход.Просто установите код статуса ответа .eg
источник
Response
свойство.Чтобы добавить к существующему ответу в ASP.NET Core> = 1.0, вы можете
Чтобы передать информацию клиенту, вы можете сделать такой вызов:
На клиенте помимо ответа 401 у вас будут также переданные данные. Например, на большинстве клиентов вы можете
await response.json()
его получить.источник
В .Net Core вы можете использовать
вместо того
который имеет преимущество перенаправления на неавторизованную страницу по умолчанию (Account / AccessDenied) вместо того, чтобы давать прямой 401
чтобы изменить расположение по умолчанию, измените свой файл startup.cs
источник
вы можете использовать следующий код в asp.net core 2.0:
источник
Вы также следуете этому коду:
источник