2013-03-19 4 views
3

В настоящее время я использую libcurl(version 7.19.6 built with SPNEGO and GSS-Negotiate support) для написания клиента (C++/C), который подключается к защищенной веб-странице (Kerberos) за сервером Tomcat. Использование командной строки: -Невозможно получить согласование аутентификации для работы в программе libcurl

curl --negotiate -u: http://prtotectedpage.jsp --verbose 

это работает (сервер возвращает HTTP-401 несанкционированной, а затем оно позволяет SPNEGO маркеров должны быть переданы и обработаны, и я получить доступ к защищенной странице).

Однако, когда я пишу следующий код и попробуйте: -

using namespace std; 
#include <stdio.h> 
#include <curl.h> 
#define YOUR_URL "http://protectedpage.jsp" 
#define ANYUSER "" 

int main(int argc, char* argv[]) 
{ 
    __asm int 3;    //a debugging thing 

//initialize a curl object 
CURLcode result; 
int x; 
CURL* curl = curl_easy_init();     
if(curl){ 
    curl_easy_setopt(curl,CURLOPT_HTTPAUTH, CURLAUTH_GSSNEGOTIATE);   
    curl_easy_setopt(curl,CURLOPT_USERNAME, ANYUSER);      
    curl_easy_setopt(curl,CURLOPT_VERBOSE, 1); 
    curl_easy_setopt(curl, CURLOPT_URL,YOUR_URL); 
    curl_easy_perform(curl); 
    curl_easy_cleanup(curl);        
} 
return 0; 
} 

Я получаю ответ от сервера после первоначального подключения (ошибка 302), которая соответствует странице временно перемещен.

Кто-нибудь знает, как это может случиться.

Некоторые другие конфигурации для информации (KDC = Windows Active Directory in Windows server 2008),

curl version(7.19.6) и

IDE = (Microsoft visual studio) 

Хорошо я сделал немного больше расследование с Wireshark и я нашел следующие различия между их начальными запросами: -

Для командной строки один (то есть успешный): -

GET /protected.jsp HTTP 1.1 \r\n 
Host : somecomputername 
User Agent: curl(7.19.6) (ipc-386-win32) libcurl/7.19.16 OPENSSL/0.9.8K \r\n 
Accept */*\r\n 
Full request: [http://somecomputername/protected.jsp] 

В то время как для кода клиента (тот, который я написал и не удалось): -

GET /protected.jsp HTTP 1.1 \r\n 
Host : somecomputername 
Accept */*\r\n 
Full request: [http://somecomputername/protected.jsp] 

Это будет означать, что агент пользователя не передается в программу. Я до сих пор смотрю на него, и некоторые входы были бы оценен

Второго редактирования: - Я сделал замечание о многословной выходе как: -

Для версии командной строки (работает один) -

> GET /examples/ HTTP/1.1 
> User-Agent: curl/7.19.6 (i386-pc-win32) libcurl/7.19.6 OpenSSL/0.9.8k 
> Host: somecomputer 
> Accept: */* 

И за неработающий один (клиент код я написал): -

> GET /examples HTTP/1.1 
Authorization: Basic RGt1bUByMTIzOg== 
User-Agent: curl/7.19.6 (i386-pc-win32) libcurl/7.19.6 OpenSSL/0.9.8k 
Host: somecomputer 
Accept: */* 

Оба эти первые строки вывода соответствующих файлов с расширением .exe. Теперь я заметил две вещи. Один из неудачных отправляется в Basic по умолчанию. Два (это более тревожное), никаких стрелок (>) в Useragent и строках хоста в неудавшемся. Означает ли это, что useragent никогда не отправляется?

+0

Вы сравнивали заголовки запросов, которые посылает ваша программа с помощью 'curl'? –

+0

Да, я предоставил их в своем редактировании (это было первым, что мне пришло в голову). –

+1

Попробуйте отправить некоторую строку пользовательского агента в свою программу, а также скажите, не отклонять ли ('-A ''') и посмотреть, что произойдет. –

ответ

2

Ok я, наконец, получил его на работу, после некоторых указателей по нм, а некоторые пытаются здесь и там я, наконец, получил рабочий код: -

using namespace std; 

#include "stdafx.h" 
#include <stdio.h> 
#include <curl.h> 

#define YOUR_URL "http://invr28ppqa24:8080/examples" 
#define ANYUSER "" 
#define ANYPWD "" 

int main(int argc, char* argv[]) 
{ 
//__asm int 3; 

//initialize a curl object 
CURLcode result; 
int x; 
CURL* curl = curl_easy_init();     //initialize a easy curl handle 
if(curl){ 
    curl_easy_setopt(curl,CURLOPT_USERNAME, ANYUSER);      //set second option to enable anyuser, a trick necessary for program to work 
    curl_easy_setopt(curl,CURLOPT_USERNAME, ANYPWD); 
    curl_easy_setopt(curl,CURLOPT_VERBOSE, 1); 
    curl_easy_setopt(curl, CURLOPT_URL,YOUR_URL); 
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, "false"); 
    curl_easy_setopt(curl, CURLOPT_USERAGENT, "curl/7.19.6 (i386-pc-win32) libcurl/7.19.6 OpenSSL/0.9.8k");  
    curl_easy_setopt(curl,CURLOPT_HTTPAUTH, CURLAUTH_GSSNEGOTIATE);   //set first option to enable gssnegotiate authentication 
    curl_easy_perform(curl); 
    //curl_easy_cleanup(curl); 
    scanf("%d", &x);       //last statement used to get delay in demo situations 
} 
return 0; 

}

302 все еще идет, и я вручную установить useragent (не очень элегантный). Из-за последующего местоположения проблема была в основном решена. Благодарю.

Исходная ошибка 302 все еще существует и остается без ответа.