Проверка подлинности 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