Включение ответов на вызов 401 при использовании WebAuthenticationConfiguration
У меня есть очень простой веб-сервис WCF4 Restful, который использует WcfRestContrib, чтобы разрешить обычную базовую аутентификацию. Это прекрасно работает, когда клиент предварительно вводит имя пользователя и пароль, но если они этого не делают, он возвращает ответ 400 Bad Request, а не запрашивает у клиента учетные данные (через ответ 401).
Служба использует декларативный подход к реализации WcfRestContrib путем украшения необходимых классов с помощью атрибутов. Вот мое объявление ServiceContract:
// Standard attributes here
[WebAuthenticationConfiguration(typeof(WebBasicAuthenticationHandler),
typeof(SecurityValidator),
false,
"SearchService")
]
public class SearchService
Который имеет только одну очень простую операцию:
// Standard attributes here
[OperationAuthentication]
SearchResponse Fetch(SearchRequest request)
И мой UserNamePasswordValidator
выглядит (хотя это, вероятно, не имеет значения, так как вызывается только при передаче учетных данных):
public override void Validate(string userName, string password)
{
// TODO: Insert login validation logic here.
// To indicate login failure, throw a FaultException
// throw new FaultException("Unknown Username or Incorrect Password");
// Just return to indicate that the username and password are valid
return;
}
Я попытался отладить WcfRestContrib и обнаружил, что WebBasicAuthenticationHandler
класс бросает BasicAuthorizationException
(который пойман только в коде фреймворка), однако, по какой-то причине он не превращает исключение в 401.
Основываясь на том, что я прочитал на сайте gcub WcfRestContrib, есть проблема, опубликованная его автором (Майком О'Брайаном), который сказал, что он хотел бы, чтобы он возвращал что-либо кроме 401, которое я прочитал, так как в настоящее время он возвращает 401 вызов.
Если эта функциональность есть, то что мне не хватает, или я делаю что-то еще не так?
ОБНОВИТЬ
Если нет способа сделать это с WcfRestContrib, есть ли альтернативный способ добиться этого (помимо использования стандартной базовой аутентификации на основе Windows в IIS)? Я открыт для любого (другого) альтернативного решения.
1 ответ
Я понял. Мне нужно украсить мой ServiceContract с ErrorHandlerAttribute
:
// Standard attributes here
[WebAuthenticationConfiguration(typeof(WebBasicAuthenticationHandler),
typeof(SecurityValidator),
false,
"SearchService"),
ErrorHandler(typeof(WebErrorHandler))]
public class SearchService
Просто добавив [ErrorHandler(typeof(WebErrorHandler))]
Присвойте сервису все волшебство. Я знал, что это должно быть что-то простое, просто хотелось бы, чтобы я увидел это, прежде чем согнуть лоб на столе.