Предварительная проверка подлинности .Net CF 2.0 HttpWebRequest и отправка учетных данных по первому запросу - PullRequest
1 голос
/ 29 июня 2009

Я пытаюсь связаться с REST API bit.ly, используя их модифицированную версию базовой аутентификации. Однако для того, чтобы это работало, HttpWebRequest необходимо прикрепить учетные данные в первом запросе, однако HttpWebRequest не будет отправлять учетные данные в первом запросе и будет ждать 401, прежде чем отправлять какие-либо учетные данные, даже если PreAuthenticate имеет значение true (с PreAuthenticate отправит учетные данные для всех последующих запросов).

Я попытался выполнить следующее, чтобы HttpWebRequest работал так, как этого требует bit.ly:

(1) Отправьте запрос в формате http://username:password@api.bi.ly/method.

Не поддерживается bit.ly (так как это ложная реализация базовой аутентификации, они проверяют только заголовок).

(2) Ввести заголовок «Авторизация» вручную в запрос HttpWebRequest.

Невозможно в .Net CF, поскольку заголовок авторизации защищен, и любая попытка изменить значение защищенного заголовка завершается неудачей и вызывает исключение ArgumentException.

(3) Наследовать HttpWebRequest или WebRequest в другом классе, чтобы реализовать требуемое поведение.

Невозможно, поскольку класс HttpWebRequest зарегистрирован по умолчанию для запросов на обслуживание для схем HTTP и HTTPS. Попытки зарегистрировать другого потомка WebRequest для этих схем потерпят неудачу, так как повторяющиеся префиксы не допускаются.

Значит, у кого-нибудь есть предложения?

1 Ответ

1 голос
/ 06 июля 2010

Примечание к (2). Я использовал метод, описанный в http://blog.kowalczyk.info/article/Forcing-basic-http-authentication-for-HttpWebReq.html, чтобы добавить заголовок авторизации, и он отлично работает в .NET CF 2.0.

public void SetBasicAuthHeader(WebRequest req, String userName, String userPassword)
{
    string authInfo = userName + ":" + userPassword;
    authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
    req.Headers["Authorization"] = "Basic " + authInfo;
}
...