Передача несанкционированных запросов в WCF?

У нас есть сервис WCF, использующий привязку webhttp. Пользователи проходят проверку подлинности, а затем вызывается метод. В этом методе мы проверяем различные параметры, связанные с пользователем, и некоторую информацию, относящуюся к запросу, прежде чем узнаем, авторизован ли пользователь для совершения вызова.

Так как это WCF, я думаю, что я должен создать FaultException, но не совсем ясно, есть ли лучшие практики.

Я думаю, что как только я узнаю, какое исключение я буду выдавать, я бы добавил IErrorHandler, который бы правильно установил заголовки на 403.

Два вопроса: 1) Есть ли стандартная FaultException для неавторизованных запросов? то есть эквивалент кода статуса http 403? 2) Должен ли я иметь возможность обрабатывать исключения, которые я буду выдавать, и изменить код ответа на 403? Смогу ли я пройти через пользовательское сообщение об ошибке? Я видел некоторые посты о том, что установка заголовков с использованием контекста операции в перехвате не распространяется на клиента.

В идеале я бы мог установить статус 403 с дополнительной информацией, такой как "Вы должны быть частью группы администраторов, чтобы добавить пользователя"

3 ответа

Решение

Я пошел дальше и извлек пользовательские исключения из FaultException, а затем добавил IErrorHandler для установки соответствующих заголовков.

Это казалось лучшим из обоих миров. Код только генерирует исключения, полученные из тех, что используются в WCF, и вся обработка, специфичная для привязки http, выполняется через IErrorHandler за пределами бизнес-логики.

Поскольку вы используете привязку webhttp, традиционное управление сбоями WCF здесь не уместно, и лучше использовать WebFaultException и WebFaultException<>;;.

Public string MyOperation()
   // Operation logic
   // ...   
   throw new WebFaultException<string>("You must be part of the administrators group to add a user", HttpStatusCode.Forbidden);
}

Как вы думаете, очень важно использовать стандартные коды состояния HTTP при разработке службы HTTP (REST-like).

По моему опыту, генерирование исключений ошибок, по крайней мере с wshttpbinding и basichttpbinding, может привести к сбою вашей веб-службы, поэтому я не рекомендую такой подход.

Если вы хотите отправить сообщение обратно неавторизованным пользователям, просто отправьте ответ в формате HTML, установив статус любого из 400 ответов, которые кажутся подходящими.

Но по опыту исключения из сбоев, даже если они являются контролируемой реакцией на действия пользователя, а не на фактическую ошибку обработки, приведут к сбою веб-службы. Я думаю, что они должны быть зарезервированы подлинной обработки исключений.

Другие вопросы по тегам