У меня есть очень простой веб-сервис 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.
Судя по тому, что я прочитал на сайте gitub WcfRestContrib , опубликована его автором (Майком О'Брайаном) , который сказал, что хотел бы увидеть его. он возвращает что-либо , кроме a 401, которое я прочитал, поскольку в настоящее время он возвращает вызов 401.
Если эта функция есть, то чего мне не хватает или я что-то не так делаю?
UPDATE
Если нет способа сделать это с помощью WcfRestContrib, есть ли альтернативный способ добиться этого (помимо использования стандартной базовой аутентификации на основе Windows в IIS)? Я открыт для любого (другого) альтернативного решения.