Проверка подлинности NTLM v1 работает только с Fiddler2, но не без

Я выдернул свои волосы сегодня с этой проблемой. Я разрабатывал собственное приложение, которое выполняет последовательность 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".

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

Спасибо ал

/// <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 ответа

Решение

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

Я пока не знаю ответа, но испытываю ту же проблему, хотя и с небольшим отличием. У меня тоже есть процесс, который не работает без запуска 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", "Digest", "Kerberos" и "Negotiate"

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

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

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