Включение ответов на вызов 401 при использовании WebAuthenticationConfiguration - PullRequest
1 голос
/ 24 февраля 2012

У меня есть очень простой веб-сервис 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)? Я открыт для любого (другого) альтернативного решения.

1 Ответ

1 голос
/ 24 февраля 2012

Я понял это. Мне нужно было украсить мой ServiceContract с помощью ErrorHandlerAttribute:

// Standard attributes here
[WebAuthenticationConfiguration(typeof(WebBasicAuthenticationHandler),
                            typeof(SecurityValidator),
                            false,
                            "SearchService"),
 ErrorHandler(typeof(WebErrorHandler))]
public class SearchService

Простое добавление атрибута [ErrorHandler(typeof(WebErrorHandler))] в службу делает все волшебство возможным. Я знал, что это должно быть что-то простое, просто хотелось бы, чтобы я увидел это, прежде чем согнуть лоб на столе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...