Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security INDY TIdHttp与SSPI的集成安全认证问题_Security_Delphi_Indy - Fatal编程技术网

Security INDY TIdHttp与SSPI的集成安全认证问题

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

我正在尝试调用应用Windows身份验证安全性的IIS上托管的web服务

我正在使用Delphi XE和INDY 10以及TIdHttp组件

如果传入有效的用户名和密码,我可以成功调用web服务,但我希望使用集成安全性,以便它自动使用来自调用线程的凭据,而不需要用户手动输入其详细信息

我已将IdAuthenticationSSPI包含在uses子句中,并将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,如果没有传递凭据,它将模拟调用线程的用户

我在网站上看到一些评论,认为这是可能的,但不幸的是,我得到了一个“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
当前未正确实施“协商”身份验证。这是一个尚未修复的问题。