如何停止使用 THTTPRIO 时出现的身份验证对话框

Posted

技术标签:

【中文标题】如何停止使用 THTTPRIO 时出现的身份验证对话框【英文标题】:How do I stop the authentication dialog appearing when using THTTPRIO 【发布时间】:2015-02-23 12:44:47 【问题描述】:

我正在使用以下代码使用基本身份验证连接到 Web 服务:

var
  RIO: THTTPRIO;
begin
  RIO := THTTPRIO.Create(nil);

  EndPoint := GetWebServicePort(True, '', RIO);

  RIO.HTTPWebNode.UserName := 'xxxx';
  RIO.HTTPWebNode.Password := 'yyyy';
...
end;

如果用户名和密码正确,一切正常。但是,如果它们不正确,则会弹出一个 Windows 对话框,要求提供正确的凭据。我需要捕获错误而不是对话框。

如何停止弹出对话框?我搜索并找到了几个结果(Link 1、Link 2),但似乎都没有提供真正的解决方案。

【问题讨论】:

这是 THttpRio 组件中一个未解决的老错误。改用印地 这是因为 Delphi 中的 Web 服务实现使用了“错误的”Windows API——使用 WinInet 而不是 WinHTTP。正如 MSDN 明确指出的 (msdn.microsoft.com/en-us/library/windows/desktop/…),“WinINet 为某些操作(例如收集用户凭据)显示用户界面。然而,WinHTTP 以编程方式处理这些操作。”这也是非常危险的,因为如果您在服务中使用它,该服务可能会“挂起”等待用户输入,因为该对话框未显示在任何用户可访问的桌面中。 不确定这是否有用,因为我自己没有尝试过,我不确定它会停止Windows 对话框,但也许事件处理程序HTTPRIO.HTTPWebNode.OnWinInetError 可以派上用场?您需要检查 HTTP_STATUS_PROXY_AUTH_REQ 错误。 请注意,您似乎可以将 WinHTTP 与 Delphi SOAP 一起使用:请参阅 ***.com/questions/26911550/… @mjn - 即使在定义了 USE_INDY 之后,对话框仍然出现。 【参考方案1】:

要捕获错误,您可以使用 HTTP 客户端库,例如 Indy TIdHTTP,首先在 Web 服务地址上运行 HTTP GET(或 HEAD)请求,并捕获用户/密码时抛出的异常错了。

uses
  ... IdHTTP ...;

...
var
  HTTP: TIdHTTP;

ValidCredentials := False;
...    
HTTP.Request.Username := username;
HTTP.Request.Password := password;
HTTP.Request.BasicAuthentication := True;
try
  HTTP.Head(url);
  ValidCredentials := HTTP.ResponseCode = 200;
except
  on ... (some Indy exception) do
  begin
    // signal that username / password are incorrect
    ...
  end;
end;

if ValidCredentials then
begin
  // invoke Web Service ...

【讨论】:

虽然这是一个行之有效的解决方案,但感觉有点像 hack。我们是否需要在每个连接之前使用上面的代码或只做一次并希望在初始检查后帐户凭据不会更改?然而,由于其他选项似乎都不起作用,这可能是我们唯一的机会。谢谢mjn!

以上是关于如何停止使用 THTTPRIO 时出现的身份验证对话框的主要内容,如果未能解决你的问题,请参考以下文章

403.60 - 使用 Azure 移动应用对 Cordova 进行身份验证时出现禁止错误

尝试对 ASP.NET Core 3.1 使用多个身份验证方案时出现异常

Laravel & VueJS CORS 尝试对用户进行身份验证时出现问题,即使使用 Cors 中间件也是如此

使用对Wildfly 10的远程EJB调用进行身份验证时出现问题

使用 Spring-boot Application 中的 Spring Security 使用 Active Directory(使用 AD 域)对用户进行身份验证时出现问题

尝试调用 AIA 时,Keycloak“处理对身份提供者的身份验证请求时出现意外错误”