2013-02-27 3 views
4

Я пытаюсь вызвать веб-службу, размещенную в IIS, с применением безопасности проверки подлинности Windows.INDY TIdHttp Интегрированная проверка подлинности безопасности с помощью SSPI

Я использую Delphi XE с INDY 10 и компонентом TIdHttp.

Я могу успешно позвонить в веб-службу, если я передаю действительное имя пользователя и пароль, но я хотел бы использовать Integrated Security, чтобы он автоматически использовал учетные данные из вызывающего потока и не требует, чтобы пользователь вручную вводил свои данные ,

Я включил IdAuthenticationSSPI в пункте изез и вызовите запрос HTTP, как:

IdHttp1.Request.BasicAuthentication := False; 
IdHttp1.HTTPOptions := [hoInProcessAuth]; 
// IdHttp1.Request.Username := '...'; // including this works 
// IdHttp1.Request.Password := '...'; // including this works 

IdHttp1.Get(myURL, myOutputStream); 

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

Я видел комментарии на сайте atozedsoftware.newsgroups, которые предполагают, что это возможно, но, к сожалению, я получаю «HTTP/1.1 401 Unauthorized».

Есть ли у кого-нибудь предложения?

+0

вы попробуйте URL с помощью браузера (IE, FF)? Если они работают, вы можете использовать Fiddler, чтобы сравнить их HTTP-связь с Indy. – mjn

+0

Да. С помощью скрипача я вижу результаты 401, которые ведут переговоры в разделе авторизации. Браузер и приложение Delphi (с именем пользователя/пароль) меняются от Negotiate до NTLM, а затем возвращают 200. С именем пользователя, пароль прокомментировал это, он никогда не пропустит 401 записей переговоров. – Mattl

+3

'IdAuthenticationSSPI' в настоящее время не выполняет проверку подлинности« Переговоры ». Это [известная проблема] (http://code.google.com/p/indyproject/issues/detail?id=236&start=100), которая еще не исправлена. –

ответ

3

Следуя из комментария Remy Lebeau, это кажется невозможным с INDY, пока не будет устранена известная проблема.

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

Сначала я импортировал библиотеку типов WinHTTP (C: \ Windows \ system32 \ winhttp.dll) и добавил WinHttp_TLB в предложение uses.

Тогда я использовал это так:

var 
    http: IWinHttpRequest; 
    url: String; 
begin 
    url := 'my web service'; 
    http := CoWinHttpRequest.Create; 
    try 
     http.SetAutoLogonPolicy(0); // Enable SSO 
     http.Open('GET', url, False); 
     http.Send(EmptyParam); 
     ShowMessage(http.ResponseText); 
    finally 
     http := nil; 
    end; 
end; 
Смежные вопросы