Включение ответов на вызов 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))] Присвойте сервису все волшебство. Я знал, что это должно быть что-то простое, просто хотелось бы, чтобы я увидел это, прежде чем согнуть лоб на столе.

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