Delphi Soap https认证失败弹出对话框

2024-01-08

我们有一个使用 SOAP(THTTPRIO 等)通信的 delphi XE 应用程序,默认情况下,该应用程序(在 delphi 中)通过 WinInet.dll 工作。我们修复了身份验证代码,使其可以使用 https 身份验证,并且当 https 的用户名和密码正确时,一切都很好。

问题是,当身份验证详细信息不正确时,您会从 Windows 收到一个消息框,该消息框可能是由 WinInet.dll 本身弹出的。我想让那个对话框消失。我不知道如何更改我的 Delphi SOAP,这样密码就不会出现。

情况是与这个问题不同 https://stackoverflow.com/questions/2287219/how-to-prevent-dialog-basic-authentication-prompt-during-call-of-webservice通过以下方式:

  1. 我正在做他正在做的所有事情,包括调用 InternetSetOption(...) 来设置用户名和密码。

  2. 我没有使用带有自签名证书的服务器,因此 soIgnoreInvalidCerts 标志不适用于我的情况。

  3. 不知何故,我想我需要对 WinInet 进行一些 API 调用来告诉它不要弹出InternetErrorDlg它有(某些版本的 Windows 称“Windows 安全选项”)会弹出询问用户。

  4. 就我而言,我们使用的配置文件中的用户名和密码是错误的(已过时),因此我们希望 WinInet 代码仅返回错误而不是弹出对话框。

也许另一个问题这个人确实弄清楚了如何做到这一点,但该问题的细节不足以看出他是如何做到的。接受的答案对我不起作用。

我遇到过一些死胡同:

WinInet MSDN 文档PLUGIN_AUTH_FLAGS_CAN_HANDLE_UI- 这似乎不适用于 WinInet 用户,而是适用于插件。

WinInet MSDN 文档讨论了 InternetSetOption,一些新闻组引导我找到以下 on-before-post 事件处理程序代码:

procedure TMyDevice.HTTPWebNodeOnBeforePost(
  const HTTPReqResp: SOAPHTTPTrans.THTTPReqResp; Data: Pointer);
var
 SecurityFlagsLen:DWORD;
 SecurityFlags:DWORD;
begin
  { authentication, NTLM+HTTPS, WinInet authentication set via WinInet SET INTERNET OPTION API.
    This approach recommended on newsgroups for https basic authentication.  }

    if fUserName<>'' then
   if not InternetSetOption(Data,
               INTERNET_OPTION_USERNAME,
               PChar(fUserName),
               Length(fUserName)) then
     raise EWebServiceAuthException.Create(SysErrorMessage(Windows.GetLastError));

   if fPassword<>'' then
  if not InternetSetOption(Data,
               INTERNET_OPTION_PASSWORD,
               PChar(fPassword),
               Length (fPassword)) then
     raise EWebServiceAuthException.Create(SysErrorMessage(Windows.GetLastError));

      { possible type of hackage: WinInet Security option flags to stop password box? }
     SecurityFlagsLen := SizeOf(SecurityFlags);
      InternetQueryOption({Request}data, INTERNET_OPTION_SECURITY_FLAGS,
      Pointer(@SecurityFlags), SecurityFlagsLen);
      SecurityFlags := SecurityFlags or SECURITY_FLAG_something;
      InternetSetOption({Request}data, INTERNET_OPTION_SECURITY_FLAGS,
      Pointer(@SecurityFlags), SecurityFlagsLen);
end;

这段代码使密码起作用,但是当用户输入的密码错误时,如何使 SOAP 调用失败或引发异常,而不是弹出消息框?


将 WinINet 替换为 WinHTTP 组件。两者都有非常接近的 API,第二个不会创建任何 UI 交互,但会返回错误代码,就像任何其他 API 一样。 WinINet 的 UI 部分对于某些软件来说可能是个好主意,但听起来并不符合您的需求。

See http://msdn.microsoft.com/en-us/library/windows/desktop/aa384068(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/aa384068(v=vs.85).aspx

当然,HTTPS 和身份验证将以类似的方式处理。但您必须提示输入用户名和密码,并根据请求更新 HTTP 标头。看这个链接 http://msdn.microsoft.com/en-us/library/windows/desktop/aa384068%28v=vs.85%29.aspx#_auth.

从我们的测试来看,WinHTTP 比 WinINet 快得多(当然是因为它没有实现任何 UI 部分,并且没有链接到 Internet Explorer 库)。

你可以看一下我们的开源课程 http://blog.synopse.info/post/2011/07/04/WinINet-vs-WinHTTP猜测 WinINet 和 WinHTTP 之间的 API 差异有多大(大多数代码在链接单元中共享)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi Soap https认证失败弹出对话框 的相关文章

  • Delphi - 将物理路径(设备文件句柄)转换为虚拟路径

    我怎样才能转换像这样的路径 设备 HarddiskVolume3 Windows 进入其相应的虚拟路径 如本例中的 c Windows 我个人更喜欢原生方式 function GetHDDDevicesWithDOSPath TString
  • 在 Delphi XE 中将类作为过程的参数传递

    我需要做的是这样的 procedure A type of form var form TForm begin form type of form Create application form showmodal freeandnil f
  • Delphi如何使用其他窗体中的类型?

    抱歉 这是一个非常新手的问题 我正在对这个庞大的应用程序进行维护 它有5种不同的形式 我们将全局变量放在一个单元 uGlobal 中 但我似乎无法从数据单元 uData 访问它 我有这个 Unit uGlobal type TmyType
  • Delphi DataSnap REST 服务器从 TStream 返回 JSON 数组,而不是二进制

    我有一个与 Android 客户端通信的 REST 服务器 我将它从 XE3 ish 升级到 Berlin 其中一个服务器方法返回一个包含 jpeg 的 TStream 并且工作得很好 很高兴将图像作为二进制图像返回 升级到 Berlin
  • 如何读取注册表项的默认值

    我有一个 Delphi XE2 项目来使用注册表项进行某些操作 所以我定义了以下代码 procedure TMainForm BitBtn01Click Sender TObject var RegistryEntry TRegistry
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 如何追踪“地址 00000000”的访问违规

    我知道如何创建 map 文件来在错误消息包含实际地址时跟踪访问冲突错误 但是如果错误消息说怎么办 Access violation at address 00000000 Read of address 00000000 我从哪里开始寻找这
  • 在 Delphi 2007 中将具有透明度的位图保存为 PNG

    我有一个包含透明度信息的 Delphi 位图 32 位 我需要将其转换并保存为 PNG 文件 同时保留透明度 我目前拥有的工具是graphics32 Library GR32 PNG 由Christian Budde 提供 和PNGImag
  • DELPHI 和 WANT 或 NANT

    We use 巡航控制 net http confluence public thoughtworks org display CCNET Welcome to CruiseControl NET在 Delphi 2006 应用程序中进行持
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • TColorProperty德尔福柏林10.1.2?

    我正在尝试将组件从 Delphi 7 转换为 Delphi Berlin 平面组件 https sourceforge net projects flatstyle https sourceforge net projects flatst
  • 使用项目中的波形文件

    我目前只能通过将波形文件放在已编译的 exe 旁边来播放背景声音 但我实际上想要一个包含波形文件的静态可执行文件 这在Delphi XE2中可能吗 这是我的代码 SndPlaySound Raw wav SND ASYNC or SND L
  • 如何释放 TInterfacedObject 中的 TObject 成员

    我知道接口对象是引用计数的 因此不需要手动释放它 但如果它有一个 TObject 继承成员 我是否应该在析构函数中手动释放该成员 考虑以下代码 program Project2 APPTYPE CONSOLE R res uses Syst
  • 打印 TDBGrid [重复]

    这个问题在这里已经有答案了 如何在不安装或下载组件的情况下打印 DBGrid OR 如何将 DBGrid 的数据放入 RichEdit 以便我可以从那里打印它 数据感知控件从 DataSource 属性获取数据 并使用它 不过 您必须手动遍
  • 通过套接字发送动态数组(在记录内)?

    我正在尝试直接使用 SendBuf 将记录从服务器传输到客户端 但是 该记录有一个动态数组的成员 并且我在某处 在 SOF 中 读到 发送记录时 成员必须是静态的 固定长度 但问题是 我无法确定如何我会 将来 发送许多论点 我怎么解决这个问
  • XML-RPC 和 SOAP 有什么区别?

    我从来没有真正理解为什么 Web 服务实施者会选择其中之一 XML RPC 通常出现在较旧的系统中吗 任何有助于理解这一点的帮助将不胜感激 差异 SOAP 更强大 并且更受软件工具供应商 MSFT NET Java 企业版等 的青睐 SOA
  • 如何在Delphi中将对象方法作为参数传递,然后调用它?

    我担心这可能是一个有点愚蠢的问题 但这让我很难过 我正在寻找将对象的方法传递到过程中的最简单的方法 以便过程可以调用对象的方法 例如 超时后 或者可能在不同的线程中 所以基本上我想 捕获对对象方法的引用 将该引用传递给过程 使用该引用 从过
  • 从特定 IP 地址发送 SOAP 请求

    我有一个具有多个 IP 地址的系统 但我只能从一个 IP 地址发起 SOAP 请求 我如何在 VB NET 中获得它 我从来没有这样做过 看起来很复杂 首先 阅读自定义 ASMX 客户端代理的方法 http johnwsaunders3 w
  • Java:由 HTTP 连接创建的等待连接线程存活时间很长

    我有一个服务器端代码 用于检查 SOAP 服务是否已启动 代码如下 String response while response length 0 try final URL url new URL DummySoapServiceURL
  • Delphi XE7 Android 全屏(隐藏软键)

    如何在XE7中全屏显示 隐藏顶部 标题 和底部 软键 工具栏 在 XE6 中 我可以通过在应用程序部分写入来调整 AndroidManifest 以使我的应用程序全屏显示并且没有操作栏 android theme android style

随机推荐

  • 如何使用 JavaScript 访问 SVG 元素?

    我正在摆弄 SVG 希望能够在 Illustrator 中创建 SVG 文件并使用 JavaScript 访问元素 这是 Illustrator 推出的 SVG 文件 它似乎还向我删除的文件的开头添加了一堆垃圾
  • 自动完成在自动完成窗口中显示相关数据

    I have 3 input fields 1 for data type and other 2 are its relevant when i press button in data type field i want to disp
  • 嵌套静态类中不允许扩展方法?

    为什么是这样 我会找到它really很高兴能够将一些扩展方法锁定为仅在我的一个类中使用 我真的不想让某些扩展方法随处可用 而且它们看起来比常规静态方法好得多 P 为了澄清 我想要这些扩展方法的原因是因为我正在扩展一个 Form 它上面有一个
  • jquery mobilescrollview-如何显示隐藏内容并阻止scrollview弹回到初始位置

    我正在使用滚动视图插件开发 JQM 项目 我已完成所有设置 并且滚动视图正在工作 但是 要滚动的 隐藏 内容不会完全加载 并且滚动视图始终会弹回到其初始位置 这是示例的链接 example http www franckreich de 3
  • 在 Html

    中设置行高,使 html 在

    具有不同字体大小时看起来像 Of​​fice Word

    如何在一个html标签中设置行高 p 当这个 p p 有两种不同的字体大小 如果我设置 p p style line height 50 p 那么整个 p 只有一种行高 但我希望它的行为就像 Microsoft Office Word 和
  • WPF 按钮图像仅显示在最后一个控件中

    我对 WPF 相当陌生 可能缺少一些简单的东西 如果我有 3 个控件 则只有最后一个控件会显示我指定的 OriginalImage 非常感激任何的帮助 谢谢 瑞安 主窗口
  • 来自 HttpClient 的重复请求

    我在 android 上使用 HttpClient 4 0 1 我发出一个 POST 请求 其标头集是当前的毫秒数 我看到该请求在彼此间隔几毫秒 5 10 的时间内两次命中服务器 但是我为两个请求设置的标头是相同的 这种情况偶尔会发生 我认
  • SQL 结果作为 PHP 数组

    如何获取包含多行到数组中的 SQL 结果 SQL 表示例 ID Cat LineID Qty DealID Cost 1 Phone 1 2 8941 25 00 2 Phone 2 43 8941 85 00 3 Net 1 2 8941
  • 校对强度和本地语言关系

    我已从 Collat or 的 Javadoc 中阅读了以下内容 对语言功能的优势的准确分配取决于区域设置 例如 在捷克语中 e 和 f 被认为是主要差异 而 e 和 是次要差异 e 和 E 是三级差异 e 和 e 是相同的 这是否意味着我
  • 在 Javascript 中编写部分复制对象的优雅方法?

    我有一个代表表单字段的 javascript 对象 其中大约 70 的字段必须复制到某些对象中才能发送到服务器 其他字段用于 UI 使用 目前 我通过手动为每个字段创建分配来克隆对象 这会导致结构不太好 如下所示 请注意 我将使要复制的部分
  • Symfony Cache 学说/orm/Proxies 无法在第 209 行打开流 /Proxy/AbstractProxyFactory.php

    我正在尝试将 symfony 移动到共享主机 我将 symfony 结构移至 我的 Web 文件夹是 public html 警告 require home user app cache prod doctrine orm Proxies
  • 使用 pytest --collect-only 仅返回单个测试名称

    我正在尝试弄清楚如何使用 pytest 从测试文件中获取测试名称列表 到目前为止我已经做到了 pytest collect only my test file py test session starts platform darwin P
  • 将两字节位掩码转换为 EnumSet

    我正在读取一个二进制文件 该文件的值存储在位掩码中 均为 1 字节位掩码和 2 字节位掩码 掩码中的每一位都充当一个开关 指示事件发生的位置 1 字节掩码示例 00000101 表示事件一和事件 3已经发生了 的例子Enum public
  • 确定该函数内的函数名称

    如何获取该非匿名函数中的函数名称 下面我假设有一个函数或进程可以执行此操作 称为magical r function 以及预期的产出是什么 my fun lt function magical r function my fun 1 my
  • JPA/EclipseLink 未返回结果

    我是 Java 和 JPA 新手 我正在尝试连接到数据库并从表中返回一些结果 但是当我运行查询时 即使该表有超过 100 000 行 我也会得到一个空列表 这是我的 persistence xml
  • 什么是 Java 混合 - Applet + 应用程序?

    我怎样才能写一个呢 从评论到我的reply https stackoverflow com a 12447764 166390 接下来是 我们过去拥有的东西 小程序和应用程序 现在已经不可用了 并反驳 垃圾 它 Applet 和应用程序 被
  • 自定义属性在编译时执行

    我正在尝试创建一个自定义属性 该属性将以某种 AOP 方式工作 不幸的是 我无法访问 postsharp 而且我对 Unity 也不是很熟悉 它有 AttributeUsage Method 并在其构造函数中配置测试环境的某些部分 从 ap
  • 将参数从脚本传递给 gulp 任务

    I have package json具有以下结构的脚本 scripts watch build tsc watch watch server nodemon src app js watch app build tsc gulp do s
  • 列出 mysql 中同一个表的结果

    我如何列出此表中性别 男性且int 女性的iduser Table usermeta id iduser a b 12 204 age 19 7 203 age 35 6 200 age 24 3 201 age 34 5 201 gend
  • Delphi Soap https认证失败弹出对话框

    我们有一个使用 SOAP THTTPRIO 等 通信的 delphi XE 应用程序 默认情况下 该应用程序 在 delphi 中 通过 WinInet dll 工作 我们修复了身份验证代码 使其可以使用 https 身份验证 并且当 ht