Security INDY TIdHttp与SSPI的集成安全认证问题
我正在尝试调用应用Windows身份验证安全性的IIS上托管的web服务 我正在使用Delphi XE和INDY 10以及TIdHttp组件 如果传入有效的用户名和密码,我可以成功调用web服务,但我希望使用集成安全性,以便它自动使用来自调用线程的凭据,而不需要用户手动输入其详细信息 我已将IdAuthenticationSSPI包含在uses子句中,并将http请求调用为:Security INDY TIdHttp与SSPI的集成安全认证问题,security,delphi,indy,Security,Delphi,Indy,我正在尝试调用应用Windows身份验证安全性的IIS上托管的web服务 我正在使用Delphi XE和INDY 10以及TIdHttp组件 如果传入有效的用户名和密码,我可以成功调用web服务,但我希望使用集成安全性,以便它自动使用来自调用线程的凭据,而不需要用户手动输入其详细信息 我已将IdAuthenticationSSPI包含在uses子句中,并将http请求调用为: IdHttp1.Request.BasicAuthentication := False; IdHttp1.HTTPOp
IdHttp1.Request.BasicAuthentication := False;
IdHttp1.HTTPOptions := [hoInProcessAuth];
// IdHttp1.Request.Username := '...'; // including this works
// IdHttp1.Request.Password := '...'; // including this works
IdHttp1.Get(myURL, myOutputStream);
我的理解是,使用IdAuthenticationSSPI,如果没有传递凭据,它将模拟调用线程的用户
我在网站上看到一些评论,认为这是可能的,但不幸的是,我得到了一个“HTTP/1.1 401未经授权”
有人有什么建议吗?根据Remy Lebeau的评论,在已知问题得到解决之前,INDY似乎不可能做到这一点 我已经用另一种方式解决了我的问题,如果其他人感兴趣,我会把它贴在这里 首先,我导入了WinHTTP类型库(C:\Windows\system32\WinHTTP.dll),并将WinHTTP\u 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;
您是否使用浏览器(即FF)尝试了URL?如果它们工作,您可以使用Fiddler将它们的HTTP通信与Indy.Yes进行比较。通过fiddler,我可以在授权部分看到已协商的401结果。浏览器和Delphi应用程序(用户名//密码)都从协商更改为NTLM,然后返回200。对于用户名,密码注释掉它永远不会通过协商401项。
IdAuthenticationSSPI
当前未正确实施“协商”身份验证。这是一个尚未修复的问题。