2013-02-27 90 views
4

我正尝试调用托管在IIS上的Web服务,并应用了Windows身份验证安全性。我使用Delphi XE INDY 10和TIdHttp组件。INDY TIdHttp与SSPI集成的安全身份验证问题

我可以成功地调用Web服务,如果我通过在一个有效的用户名和密码,但我想用集成安全性,使其自动调用线程使用的凭据,并且不需要用户手动输入他们的详细资料。

我已经包含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未授权”。

有没有人有任何建议?

+0

你尝试的网址与浏览器(IE,FF)?如果他们工作,你可以使用Fiddler来比较他们与Indy的HTTP通信。 – mjn 2013-02-27 13:44:41

+0

是的。随着提琴手,我可以看到在授权部分有协商的401结果。浏览器和Delphi应用程序(使用用户名/密码)都从Negotiate更改为NTLM,然后返回200.使用Username,Password注释掉它永远不会超过协商401条目。 – Mattl 2013-02-27 13:58:34

+3

'IdAuthenticationSSPI'当前未正确实施“协商”认证。这是一个尚未确定的[已知问题](http://code.google.com/p/indyproject/issues/detail?id=236&start=100)。 – 2013-02-27 18:01:24

回答

3

从雷米勒博的评论继看来这是不可能的INDY直到一个已知的问题是固定的。

我已经解决了我的问题,以另一种方式,我将它张贴在这里如果任何人有兴趣。

首先我导入WinHTTP的类型库(C:\ WINDOWS \ SYSTEM32 \ winhttp.dll),并加入WinHttp_TLB到使用条款。

然后我用这样的:

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;