2013-06-18 3 views
1

Я пытаюсь добавить функциональность в свое приложение C#, чтобы протестировать подключение к службе OData, которая защищена только с помощью проверки подлинности Windows. Следующий блок кода, что я использую, чтобы выполнить этот тест:Аутентификация Windows для службы OData возвращает «401 - Несанкционированное» в приложении C#, но работает в браузере

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(SERVICE_NAME)); 
CredentialCache myCache = new CredentialCache(); 

myCache.Add(new Uri(SERVICE_NAME), "Negotiate", new NetworkCredential(user, password)); 
resolver.Credentials = myCache; 

// Do a simple request 
request.Credentials = myCache; 
request.PreAuthenticate = true; 
request.KeepAlive = true; 
request.AllowAutoRedirect = true; 
request.CookieContainer = new CookieContainer(); 
object response = request.GetResponse(); // This is where the exception is thrown 

Когда я запускаю приведенный выше код, я получаю 401 - Несанкционированное ошибку, как указано ранее. Однако, когда я запускаю Fiddler2, код работает нормально. Поэтому вместо этого я использую Wireshark. Кроме того, служба работает идеально в моем браузере (Chrome), и если я использую Wireshark для сравнения HTTP-запросов/ответов для аутентификации, я вижу, что они почти идентичны, за исключением того, что в Chrome у меня есть: Accept, User-Agent , Accept-Encoding и Accept-Language, в то время как мое приложение C# не имеет этих. Единственное отличие состоит в том, что мое приложение C# устанавливает флаг «Negotiate Seal» в заголовке NTLM, в то время как Chrome не устанавливает этот флаг.

Несмотря на эти различия, фаза аутентификации, по-видимому, отлично работает в приложении C#, пока служба не вернет 302 - перенаправление, после чего приложение пробует GET на вновь перенаправленном URI, который снова возвращает 401 (когда Chrome делает аналогичное GET, он получает HTTP 200 - OK и продолжает свой веселый путь).

Итак, любые идеи, что может вызвать это? Проблема с сервисом? или мой код?

Большое спасибо! -Erik

ответ

0

Хорошо, два целых дня исследований, и я нашел ответ. Строка 3 в приведенном выше коде использовала полный URI службы («.../Northwind/Northwind.svc»), когда запрос был перенаправлен, учетные данные больше не применяются к новому URI. Решение заключалось в том, чтобы передать только начальную часть («...») URI. Глупая ошибка с моей стороны.

Смежные вопросы