2013-02-27 1 views
4

Windows 인증 보안이 적용된 IIS에서 호스팅되는 웹 서비스를 호출하려고합니다.INDY TIdHttp SSPI의 통합 보안 인증 문제

저는 INDY 10 및 TIdHttp 구성 요소와 함께 델파이 XE를 사용하고 있습니다.

유효한 사용자 이름과 암호를 전달하면 성공적으로 웹 서비스를 호출 할 수 있지만 통합 보안을 사용하여 호출 스레드의 자격 증명을 자동으로 사용하므로 사용자가 직접 세부 정보를 입력 할 필요가 없습니다. .

내가 uses 절에 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

당신이 브라우저 (IE, FF)로 URL을 시도 않았다

그때 나는이처럼 사용? 작동하는 경우 Fiddler를 사용하여 HTTP 통신을 Indy와 비교할 수 있습니다. – mjn

+0

예. 피 들러를 사용하면 인증 섹션에서 협상을 수행 한 401 개의 결과를 볼 수 있습니다. 브라우저와 Delphi 응용 프로그램 (사용자 이름 // 암호 사용)은 모두 Negotiate에서 NTLM으로 변경 한 다음 200을 반환합니다. Username을 사용하면 암호가 주석 처리되어 협상 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;