如何对此HTTPS SOAP服务进行身份验证?

时间:2011-09-18 17:03:10

标签: delphi soap https

我正在尝试创建一个小工具来监控我使用了多少带宽以及我从ISP获得了多少带宽。他们有一个SOAP服务,我必须验证我的UserName和密码并验证客户端,然后我将得到2个GUID,必须传递给将从数组返回使用情况统计信息的函数。然后将它们缓存1小时,我必须再次进行身份验证。

我在Delphi 2010中使用过WSDL Importer,它为我生成了一个单元。 (我不确定我应该发布它,因为它非常大)?

我正在尝试使用以下代码使用我的用户名和密码验证第一部分:

procedure TForm1.btnAuthClick(Sender: TObject);
var
  fGUID: string;
begin
  HTTPRIO1.URL := 'https://webservices.zen.co.uk/broadband/v3.11/serviceengine.asmx?WSDL';
  try
    fGUID := (HTTPRIO1 as ServiceEngineSoap).Authenticate(edtUserName.Text,edtPassword.Text);
    Label1.Caption := fGUID;
  except
    on E: Exception do
    Memo1.Lines.Text := E.Message;
  end;
end;

以上代码始终返回以下错误:

  

最终收件人的标头http://schemas.xmlsoap.org/ws/2004/08/addressing:Action是必需的,但不会出现在邮件中。


我尝试使用WSDLLocation代替服务和端口:

procedure TForm1.btnAuthClick(Sender: TObject);
var
  fGUID: string;
begin
  HTTPRIO1.WSDLLocation := 'https://webservices.zen.co.uk/broadband/v3.11/serviceengine.asmx?WSDL';
  HTTPRIO1.Service := 'ServiceEngine';
  HTTPRIO1.Port := 'ServiceEngineSoap';
  try
    fGUID := (HTTPRIO1 as ServiceEngineSoap).Authenticate(edtUserName.Text,edtPassword.Text);
    Label1.Caption := fGUID;
  except
    on E: Exception do
    Memo1.Lines.Text := E.Message;
  end;
end; 

这将始终生成以下错误:

  

无法从WSDL'https://webservices.zen.co.uk/broadband/v3.11/serviceengine.asmx?WSDL'


我在这里做错了什么?如果我实际上应该发送一个标题,那么我该如何做这个来验证自己的服务呢?

1 个答案:

答案 0 :(得分:4)

根据docs

  

如果服务器需要身份验证,请使用该属性   THTTPReqResp对象提供必要的信息

您在THTTPReqResp对象中设置了user / pw(HTTPRIO1.HTTPWebNode.UserName:='xxx'; HTTPRIO1.HTTPWebNode.Password:='yyy')

另请参阅有关使用HTTPS的文档:

  

THTTPReqResp使用WinInet建立与服务器的连接。   必须在客户端系统上安装Wininet.dll。 wininet.dll是   如果您有IE3或更高版本,请在Windows系统目录中找到   安装。 WinInet的优势在于它提供了支持   安全连接(https)。要使用WinInet,请编译您的项目   没有定义USE_INDY符号

但是,根据下面的帖子,看起来这个用户/ pw可能只在代理情况下使用。请关注Jean-Marie Babet与2007年给出的原始解决方法的链接,如果他们仍然没有解决这个问题:

https://forums.codegear.com/thread.jspa?threadID=58755&tstart=0

以下是解决方法:

  

您所要做的就是处理OnBeforePost事件   HTTPRIO.HTTPWebNode组件并使用InternetSetOption。这是一个   示例来自与MapPoint对话的示例(MapPoint.NET使用   '摘要'身份验证 - “基本”身份验证的一种变体:

procedure TTestMapPointRender.HTTPRIO1HTTPWebNode1BeforePost(
  const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
  UserName: string;
  PassWord: string;
begin
  UserName := GetWSToken('MapPoint', 'UserName');
  Password := GetWSToken('MapPoint', 'Password');
  if not InternetSetOption(Data,
               INTERNET_OPTION_USERNAME,
               PChar(UserName),
               Length(UserName)) then
     raiseException(SysErrorMessage(GetLastError));

  if not InternetSetOption(Data,
               INTERNET_OPTION_PASSWORD,
               PChar(Password),
               Length (Password)) then
     raiseException(SysErrorMessage(GetLastError));
end;