4

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

我将 Delphi XE 与 INDY 10 和 TIdHttp 组件一起使用。

如果我传入有效的用户名和密码,我可以成功调用 Web 服务,但我想使用集成安全性,以便它自动使用来自调用线程的凭据,并且不需要用户手动输入他们的详细信息。

我在 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”。

有没有人有什么建议?

4

1 回答 1

3

根据 Remy Lebeau 的评论,在已知问题得到解决之前,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;
于 2013-02-28T10:13:11.027 回答