Delphi SOAP 调用显示 IE 登录对话框 - 如何防止它?

Posted

技术标签:

【中文标题】Delphi SOAP 调用显示 IE 登录对话框 - 如何防止它?【英文标题】:Delphi SOAP call shows IE login dialog - how to prevent it? 【发布时间】:2020-11-10 11:28:02 【问题描述】:

我们有两个应用程序。他们使用 SOAP 协议调用网站。

其中一个人在我们的登录表单中询问了登录数据;另一种是后台进程,定时任务。 他们都使用 InternetSetOption 进行基本身份验证。

如果用户输入错误的用户名或密码,SOAP 调用将显示一个 IE 对话框以再次获取用户名/密码。

1.) 这不是我们的风格。 2.)对话框是“无限的”,它询问,只有成功或取消才能重新显示。 3.) 我们无法控制,会出现多少次。 4.) 在后台进程中,对话框停止进程 - 这很关键。

所以我需要一些选项或事件来阻止显示 IE 登录对话框。

如果登录名/密码错误,程序必须以 401 中止,而不会无限显示 IE 对话框。

我该怎么做?

请帮助一些代码。谢谢!


部分代码。但我认为这并没有太大帮助。这是一个带有基本身份验证的简单 SOAP 调用。但是如果登录不正确,IE会显示他的对话框。

type TWSRIO = class(THTTPRIO)
...
end;

procedure TWSRIO.OnBeforePost(const HTTPReqResp: THTTPReqResp; Data:Pointer);
begin
  if Auth_Mod = SCRBRIO_Auth_Basic then
  begin
    if not InternetSetOption(Data,INTERNET_OPTION_USERNAME,PChar(FAuth_LoginName), Length(FAuth_LoginName)) then
        raise Exception.Create(SysErrorMessage(GetLastError));
    if not InternetSetOption(Data, INTERNET_OPTION_PASSWORD, PChar(FAuth_Password), Length(FAuth_Password)) then
        raise Exception.Create(SysErrorMessage(GetLastError));
  end;
end;

procedure TForm1.Test;
begin
  RIO := TWSRIO.Create(Self);
  RIO.Auth_Mode := SCRBRIO_Auth_Basic;
  RIO.Auth_LoginName := xxx;
  RIO.Auth_Password := yyy;
  ...
  o := GetStockQueryResponderInterface(False, GetURL(), RIO);
  o.GetStockQuery(sArtNr)
  ...
end;

【问题讨论】:

当收到状态 401 时,THTTPRIO 会自动调用 InternetErrorDlg()。我不知道你是否可以改变这种行为。 我尝试搜索但没有从应用程序端控制此行为的任何方法。如果可能的话,您可以尝试使用 IE 浏览器提供的Authentication options 进行检查和测试。这可能有助于避免这个问题。 我需要写“OnWinInetError”来避免吗?但正如我所见,我没有办法返回正常的处理程序。例如: if (ErrorCode = ThisError) then MyHandler else OriginalHandler. 您是否使用我在上一条评论中建议的身份验证选项进行了测试?它起作用了吗?你能告诉我们,你用它得到了什么结果? 匿名登录没有显示任何对话框。谢谢。但问题是我无法将此选项强制用于 1200 个用户(在 250 个不同的公司中)。 【参考方案1】:

也许解决办法是:

function TMyRIO.MyWiniNetError(LastError: DWord; Request: Pointer): DWord;
var
    OWEProc: TWinInetErrorEvent;
begin
    // When the LastError is zero, we return same code what the dialog does on Cancel
    if LastError = 0 then
    begin
        Result := ERROR_SUCCESS;
        Exit;
    end;
    if Assigned(HTTPWebNode) then
    begin
        try
            // Save old proc and set to nil for Avoid infinite loop
            OWEProc := Self.HTTPWebNode.OnWinInetError;
            Self.HTTPWebNode.OnWinInetError := nil;
            try
                // Call the original handler
                Result := Self.HTTPWebNode.HandleWinInetError(LastError, Request, True);
            finally
                // Restore our handler 
                Self.HTTPWebNode.OnWinInetError := OWEProc;
            end;
        except
            on E: Exception do
            begin
                // On  error we log the problem
                LogThis(E.Message);
                Result := ERROR_SUCCESS;
                Exit;
            end;
        end;
    end else
    begin
        Result := ERROR_SUCCESS;
        Exit;
    end;
end;

我不知道我们会得到什么样的副作用。 但是使用此代码,我无法获得错误身份验证的 Windows 登录对话框。只是错误。

【讨论】:

以上是关于Delphi SOAP 调用显示 IE 登录对话框 - 如何防止它?的主要内容,如果未能解决你的问题,请参考以下文章

IE7 中不显示 jQuery UI 对话框

SOAP好像是一种远程调用方式

请问我用Delphi写的ISAPI的WEBSERVICE,调试时怎么看SOAP报文?

如何用Delphi开发独立IE内核的浏览器

Delphi 7 SOAP 身份验证和会话 ID 如何

哪些选项可用于使用 SOAP 在 Delphi 中实现长轮询?