Проверка подлинности NTLM v1 работает только с Fiddler2, но не без - PullRequest
0 голосов
/ 07 ноября 2011

Я сегодня выдернул свои волосы из-за этой проблемы. Я разрабатывал собственное приложение, которое выполняет последовательность HTTP GET и POST для заполнения ряда веб-форм. Код работает нормально, когда я запускаю fiddler2 - инструмент, который я использовал для отладки моих GET URI и POST FormData. Теперь я не использую fiddler2. Я получаю ошибку 401 аутентификации. Я бы посмотрел на заголовок, чтобы сравнить, но это немного сложно, не имея возможности запустить Fiddler.

В основном мой код работает путем доступа к URI и хранения cookie. Доступ к сайту контролируется SSO, и, поскольку сервер работает в 2003 году, он хочет использовать NTLMv1. Первая проблема, с которой я столкнулся при работе с клиентами Windows 7, заключалась в том, что Win7 согласовывала 128-битный режим, тогда как сервер говорил только 64-битный, а аутентификация не выполнялась (окончательный вариант 401). С fiddler2 и установкой групповой политики на локальном компьютере на 64-битную, я смог завершить свою работу. Затем я превратил программное обеспечение в веб-сервис и обнаружил, что сегодня проблема заключается в том, что оно не работает. Как я уже говорил ранее, все работает нормально с запущенным fiddler2, оставляя мне немного дыры, так как я не могу заставить каждый клиент установить и использовать fiddler2 только для того, чтобы получить мою функциональность!

Во-первых, у меня есть функция для сохранения куки ... Затем у меня есть другая функция, которая выполняет получение, используя этот cookie, первая функция всегда завершается с ошибкой: «Удаленный сервер возвратил ошибку: (401) Unauthorized.»

Я надеюсь, что где-то упустил что-то очевидное и не пытаюсь сделать что-то невозможное.

Спасибо, Al

/// <summary>
/// Function to get a cookie from a site providing the given site and credentials - this cookie then can be reused for subsequent calls
/// </summary>
/// <param name="credential">The NetworkCredential to access the site</param>
/// <param name="Uri">The Uri of the site</param>
/// <returns>A CookieContainer containing all needed cookies</returns>
private CookieContainer GetCookie(NetworkCredential credential, string Uri)
{
    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(Uri);
    HttpWebResponse resp;
    CookieContainer cookieJar = new CookieContainer();
    req.AllowAutoRedirect = true;
    req.Credentials = credential;
    req.CookieContainer = cookieJar;
    resp = (HttpWebResponse)req.GetResponse();      // This line always fails with: The remote server returned an error: (401) Unauthorized.
    return cookieJar;
}

/// <summary>
/// Function to perform a HTTP GET 
/// </summary>
/// <param name="cookieJar">A CookieContainer for keeping the reference of our sessions</param>
/// <param name="credential">The Credentials to use to access the site</param>
/// <param name="Uri">The Uri to GET</param>
private void DoGet(CookieContainer cookieJar, NetworkCredential credential, string Uri)
{
    HttpWebRequest req;
    HttpWebResponse resp;

    // Just grab the site uri where the cookie is stored
    string[] UriParts = Uri.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
    Uri CookieUri = new Uri(UriParts[0] + "//" + UriParts[1]);

    // Use cookie information to get first page of call entry
    req = (HttpWebRequest)HttpWebRequest.Create(Uri);
    req.CookieContainer = new CookieContainer();
    req.CookieContainer.Add(cookieJar.GetCookies(CookieUri)[0]);
    req.AllowAutoRedirect = true;
    req.Credentials = credential;
    req.CookieContainer = cookieJar;
    resp = (HttpWebResponse)req.GetResponse();
}

Ответы [ 2 ]

1 голос
/ 10 марта 2012

Я пока не знаю ответа, но я испытываю ту же проблему, хотя и с небольшой разницей.У меня тоже есть процесс, который не работает без запуска fiddler2, работает как чемпион.Во-первых, у нас есть диспетчерское приложение, которое подключается и отправляет необработанное сообщение Soap различным веб-службам, а затем получает ответы и передает их обратно в базу данных.Для нескольких служб и в течение довольно продолжительного времени, кстати, это внешние услуги, процесс запущен без каких-либо проблем.Однако, когда мы представили веб-сервис, который, как оказалось, был разработан собственными силами, у меня возникла точно такая же проблема.

Сначала я подозревал, что скрипач, действующий в качестве прокси-сервера, каким-то образом разрешает учетные данныевопрос.Это может или не может быть, но это кажется хорошим местом для начала.Прежде всего, я до сих пор тестировал оба:

IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);

и

HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();

без разрешения.Кроме того, я использовал

webRequest.Credentials = CredentialCache.DefaultCredentials;

и

webRequest.Credentials = CredentialCache.DefaultNetworkCredentials;  

снова, без разрешения.Я действительно полагаю, что вы что-то делаете с NTLMv1, и я думаю, что, возможно, нам нужно как-то выдать учетные данные для аутентификации / авторизации NTLMv1.

Состояния сайтов Microsoft: поддерживаемые значения для authType - «NTLM», "Дайджест", "Kerberos" и "Переговоры"

Полная история

Это всего лишь выстрел в темноте, но это может быть проблемой сна стороне сервера?Прочитайте следующую ссылку: http://support.microsoft.com/kb/813834

0 голосов
/ 19 ноября 2012

Моим решением было принудительное использование 64-битной NTLMv1 на сервере. Не решение для всех, кого я знаю, но оно работает для нас.

...