如何在 Delphi 7 中使用 Indy 10 进行 NTLM 身份验证?

2024-03-29

我想在 Delphi 7 中使用 Indy 10 组件进行 NTLM 身份验证。 这是我的源代码:

 uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs ,StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP,IdAuthenticationSSPI , IdAuthentication , IdAuthenticationDigest , IdHeaderList;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Memo1.Lines.add(   IdHTTP1.Get('http://www.google.co.in'));
end;

procedure TForm1.IdHTTP1ProxyAuthorization(Sender: TObject;
      Authentication: TIdAuthentication; var Handled: Boolean);
var
   UserName: string;
   UserNameLen: Dword;
begin
   Authentication.Username := 'xxxxx';
   Authentication.Password := 'xxxx';
   Handled := False;  // Tried setting it to True , No Changes in error
End;


 procedure TForm1.IdHTTP1SelectProxyAuthorization(Sender: TObject;
     var AuthenticationClass: TIdAuthenticationClass;
    AuthInfo: TIdHeaderList);
 begin
   // First check for NTLM authentication, as you do not need to
  // set username and password because Indy will automatically   
  // handle passing your Windows Domain username and
  // password to the proxy server
  if (pos('Proxy-Authenticate: NTLM', idHTTP1.Response.RawHeaders.Text)>0) then
  begin
    idHTTP1.ProxyParams.Clear;
    idHTTP1.ProxyParams.BasicAuthentication := false;
   // Set the authentication class to NTLM
    //idhttp1.auth
     AuthenticationClass := TIdSSPINTLMAuthentication;
  end
  else
  begin
    // Next check for Basic
    if (pos('Proxy-Authenticate: Basic', idHTTP1.Response.RawHeaders.Text)>0) then
    begin
      AuthenticationClass := TIdBasicAuthentication;
      idHTTP1.ProxyParams.BasicAuthentication := true;
   end
   else
   begin
      // Then Digest
      if (pos('Proxy-Authenticate: Digest', idHTTP1.Response.RawHeaders.Text)>0) then
         AuthenticationClass := TIdDigestAuthentication
   end;
   end;
   idHTTP1.ProxyParams.ProxyUsername := 'xxxx';
   idHTTP1.ProxyParams.ProxyPassword := 'xxxx';
  end;

根据我在互联网上阅读的内容,我还将 IdHttp.pas 的源代码修改为以下内容:-

 function TIdCustomHTTP.DoOnProxyAuthorization(ARequest: TIdHTTPRequest; AResponse: TIdHTTPResponse):      Boolean;
var
   i: Integer;
   S: string;
   Auth: TIdAuthenticationClass;
begin
   Inc(FAuthProxyRetries);
   if not Assigned(ProxyParams.Authentication) then
   begin
     // Find which Authentication method is supported from us.
      i := 0;
     while i < AResponse.ProxyAuthenticate.Count do
     begin
        S := AResponse.ProxyAuthenticate[i];
     try
        Auth := FindAuthClass(Fetch(S));
        break;
     except
     end;
     inc(i);
   end;

   if i = AResponse.ProxyAuthenticate.Count then
   begin
      result := false;
     exit;
   end;

   if Assigned(FOnSelectProxyAuthorization) then
   begin
      OnSelectProxyAuthorization(self, Auth, AResponse.ProxyAuthenticate);
   end;

   {    ProxyParams.Authentication := Auth.Create;
   end;

   result := Assigned(OnProxyAuthorization);

  // Clear password and reset autorization if previous failed
   if (AResponse.FResponseCode = 407) then begin
       ProxyParams.ProxyPassword := '';
       ProxyParams.Authentication.Reset;
    end; }
    /// *** Changes Start **** ////
    if Assigned(Auth) then
   begin
      ProxyParams.Authentication := Auth.Create;
    end;
  end;

  result := Assigned(ProxyParams.Authentication)  and  Assigned(OnProxyAuthorization);

  // Clear password and reset autorization if previous failed
  if ((AResponse.FResponseCode = 407) and
      (not (ProxyParams.Authentication is TIdSSPINTLMAuthentication))) then
  begin
     ProxyParams.ProxyPassword := '';
     if Assigned(ProxyParams.Authentication) then
     begin
       ProxyParams.Authentication.Reset;
     end;
  End;
   //// **** Changes end *** /////
  if Result then
  begin
   with ProxyParams.Authentication do
   begin
     Username := ProxyParams.ProxyUsername;
     Password := ProxyParams.ProxyPassword;

    AuthParams := AResponse.ProxyAuthenticate;
  end;

result := false;

repeat
  case ProxyParams.Authentication.Next of
    wnAskTheProgram: // Ask the user porgram to supply us with authorization information
      begin
        if Assigned(OnProxyAuthorization) then
        begin
          ProxyParams.Authentication.Username := ProxyParams.ProxyUsername;
          ProxyParams.Authentication.Password := ProxyParams.ProxyPassword;

          OnProxyAuthorization(self, ProxyParams.Authentication, result);

          if result then begin
            ProxyParams.ProxyUsername := ProxyParams.Authentication.Username;
            ProxyParams.ProxyPassword := ProxyParams.Authentication.Password;
          end
          else begin
            break;
          end;
        end;
      end;
    wnDoRequest:
      begin
        result := true;
        break;
      end;
    wnFail:
      begin
        result := False;
        Break;
      end;
  end;
until false;
// *** Changes start *** ///
If Result then
begin
  Response.KeepAlive := ProxyParams.Authentication.KeepAlive;
end;
///*** Changes End *** ///

结尾; 结尾;

我仍然收到 407 代理授权错误。有人可以指导我做错了什么吗?

提前致谢


尝试在 IdHTTP1SelectProxyAuthorization 方法中省略以下代码行:

idHTTP1.ProxyParams.Clear;

在我看来,这会清除代理的所有设置,这就是您收到错误的原因。

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

如何在 Delphi 7 中使用 Indy 10 进行 NTLM 身份验证? 的相关文章

  • TOpenDialog/NSOpenPanel 无法在沙盒 Delphi 应用程序中工作

    Firemonkey 应用程序中的 TOpenDialog 似乎存在问题 该应用程序已针对 Mac Appstore 进行沙箱处理 我使用XE3 但它也存在于XE2中 我其实在这里找到了一份QC报告 但仍然没有解决 http qc emba
  • Delphi 2009 IDE结构视图折叠功能

    现在有谁知道折叠 Delphi 2009 IDE 结构视图中的所有项目吗 我不知道折叠所有项目 这使我很难从视图中找到我的课程 Thanks 选择根节点 类 并按数字键盘上的 除号 那会让一切崩溃 然后按数字键盘上的 加号 键 第一级将展开
  • 每次 TDbGrid 的选定位置更改时都会触发什么事件?

    我的项目中有一个 TDbGrid 每次更改所选行时我都试图触发一个事件 行中的任何更改都已经更新了链接到同一数据源的所有数据感知控件 但还需要进行其他更改 我需要一个事件处理程序 我认为 OnColEnter 会起作用 根据帮助文件 它在以
  • 如何检查注册表项是否存在

    我不知道我的错误在哪里 它总是跳到else分支 但是密钥存在 我检查了几次 var reg TRegistry begin with TRegistry Create do try RootKey HKEY CURRENT USER Ope
  • 在 Delphi 中的 SOAP 标头中发送简单字符串

    我需要发送这样的东西
  • 将 [字节数组] 分配给没有 Unicode 转换的 Variant

    考虑以下代码片段 在 Delphi XE2 中 function PrepData StrVal string Base64Val AnsiString OleVariant begin Result VarArrayCreate 0 1
  • 在比较 Delphi 表单文件的版本时,如何使 Beyond Compare 忽略某些差异

    我使用Beyond Compare 版本3 1 10 来比较不同版本的Delphi Form Files 但我不想看到有关ExplicitTop ExplicitLeft ExplicitHeight 和ExplicitWidth 的差异
  • delphi THashSHA2 在大文件上返回错误的 SHA256

    Data Cloud CloudAPI pas has class function TCloudSHA256Authentication GetStreamToHashSHA256Hex const Content TStream str
  • 使用 spring security 和 ntlm 过滤器后 POST 参数被神秘地吃掉

    我有一个自定义过滤器 它通过检查数据库来执行 Spring Security 身份验证 另一个过滤器检查 NTLM 提供程序 问题是这样的 输入网址http myapp com app somestuff stuff http myapp
  • 无法使用 Indy 从 Gmail 获取电子邮件

    I use TIdPOP3很多 而且效果很好 除了 GMail 帐户 不知怎的 它永远不起作用 我尝试了不同的组合和端口 无论是否使用 SSL 它总是返回不同的错误 我最近的尝试是在 Gmail 上创建 应用程序特定 密码 并尝试使用此密码
  • 创建无边框表单而不丢失 Windows 命令

    我已将表单更改为无边框表单 我只是更改了BorderStyle财产给bsNone 但现在我的应用程序失去了 Windows 锚点和一些命令 例如 WIN 对齐表单客户端 WIN 最小化表格 WIN 表格右对齐 WIN 表格左对齐 我尝试过设
  • 如何制作自定义组件属性?

    我需要帮助来制作一个控件属性 当您单击它时 它会弹出一个自定义对话框 例如设置 就像 TPicture 一样 有什么想法或建议吗 如果您的类用作其他组件的属性 并且您想使用对象检查器来调用对话框 那么您必须实现并注册一个自定义属性编辑器 例
  • 如何改变TDateTimePicker的颜色?

    如何更改 a 的颜色TDateTimePicker A 日期和时间选择器可以有一种颜色 通常这是通过设置来完成的Color procedure TForm1 FormCreate Sender TObject begin DateTimeP
  • Delphi 中的非字母排序

    我正在尝试按特定顺序对字符串列表进行排序 我尝试用 B C A 来订购 而不是 A B C 我已经按照我需要的顺序声明了一个 const 数组 我尝试过 CustomSorte 但我不明白如何编写该函数 我现在正在尝试使用 for 循环 但
  • 在这些情况下限制破折号的正则表达式模式

    Scenario 我正在使用第三方文件重命名软件 该软件是用 Delphi 编写的 并且具有 pascal 脚本支持 该应用程序允许使用正则表达式来重命名文件 这意味着 如果我需要对文件名执行的操作不能仅使用一个正则表达式来完成 那么我可以
  • 当应用程序最小化时隐藏表单

    我有一个主表单和一个状态表单 当我的应用程序中的工作正在进行时 我会显示它们 如果工作完成我就打电话Hide状态表上出现 状态表消失 当我最小化主窗体而等待窗体可见时 就会出现问题 然后两种形式都被隐藏 这就是我想要的 但是 如果工作完成时
  • Delphi - 引用在运行时创建的组件

    我正在使用 Delphi 5 并且在运行时创建许多面板 然后在面板上创建按钮 显然也是在运行时创建 我需要这样做 因为将来我可能需要动态创建更多面板 按钮组合 我可以完成所有这些 但我不知道如何引用我创建的面板 因为我找不到访问面板组件名称
  • 如何使用 DSPACK 将自定义音频缓冲区注入 DirectX 过滤器图表?

    我使用 Delphi 6 和 DSPACK 来执行一些涉及音频和 DirectX 的操作 我在 输入 方面找到了将枚举的音频输入设备之一分配给 TFilter 对象并将该过滤器连接到 TSampleGrabber 对象的位置 这为我提供了将
  • Delphi 生成的 Dylib 在 OSX 上的可靠部署

    我想在 OSX 上部署一个 dylib 它是用 Delphi 创建的 这个 dylib 应该是可由第三方应用程序加载 这看起来像是一个重复的问题 但经过大量搜索后 我找不到答案 这和这个是同一个问题 https forums embarca
  • 如何在 Spring 中的 Rest 模板标头中设置 NTLM 身份验证

    我想使用 Rest 模板对 NTLM 进行身份验证 有人可以建议一种方法吗 如果有人再次偶然发现此条目 这是内置解决方案 确保您的项目包括org apache httpcomponents httpclient 然后您可以使用以下代码片段构

随机推荐

  • 使用纯 CSS 定位第一个可见元素

    我想知道是否可以将以下内容转换为纯 CSS child visible first css border top 1px solid cccccc border bottom 1px solid cccccc 我似乎无法找到解决方案 作为抽
  • 替换字符串 php 中的最后一个斜杠

    我很难绕过正则表达式 我正在尝试删除字符串中的最后一个正斜杠 public url https api mongohq com 我的目的是删除最后一个正斜杠并将其替换为其他内容 我想我可以用preg replace但我找不到正确的模式来做到
  • 如何获取git中索引的树哈希?

    使用 git 如何获取分阶段更改的树哈希 也就是说 如果我提交了更改 提交的树哈希 不是提交哈希 将是什么 最简单的方法是提交树 git commit tree 解释 您不必进行完整的提交 当然这也是可行的 你只需要snapshot提交将会
  • 何时使用 EventListenerList 而不是一般的侦听器集合

    当我学习如何在 Java 中触发事件时 我开始熟悉 EventListenerList 当我创建自己的侦听器时 我编写侦听器 使其扩展 EventListener 将它们存储在 EventListenerList 中 并且我的 fire 方
  • T4 模板和 Visual Studio 项模板

    是否可以创建从 T4 模板生成的 Visual Studio 项模板 我的 google fu 似乎不够强大 无法给出答案 是的 你需要使用GAX http msdn microsoft com en us teamsystem aa718
  • Flutter 容器:无法同时提供颜色和装饰

    我想在容器周围绘制边框并为背景着色 Widget bodyWidget return Container color Colors yellow decoration BoxDecoration border Border all colo
  • 计算 Javascript 的循环复杂度 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何工具可用于计算 Javascript 中的圈复杂度 我过去在处理服务器端代码时发现它是一个非常有用的指标 并且希望能够将它用于我
  • 包含脚本、延迟或在 DOMContentLoaded 事件上执行的最佳实践?

    所以 我知道脚本执行的一般顺序 根据this https javascript info script async defer defered 脚本在之前执行DOMContentLoaded事件被触发 但不会阻止页面和后续脚本的加载 除非它
  • Xcode 4.0.2 启动时崩溃

    Xcode 在启动时崩溃 我不知道为什么 我下载了 4 0 2 iOS SDK 4 3 并安装了它 然后我尝试打开它 但它在启动时崩溃了 这是与崩溃相关的控制台日志 enter cdyld Library not loaded System
  • Auth0 - Django 和石墨烯

    我目前正在使用 Graphql 和 Django Graphene JWT 我使用 django 作为后端 所有请求均通过如下所示的令牌进行身份验证 我有一个为 graphql 创建身份验证令牌的模式 目前如下所示 class Mutati
  • 在 Java 中通过 JDBC 查询速度慢,但在其他系统(TOAD)中则不然

    您好 我有一个对 Oracle 系统的查询 其中涉及一个视图 该视图通过将 TO NUMBER 应用于表主键来连接其他表 如果我使用 TOAD 进行查询 查询速度非常快 800 个寄存器 1 秒 如果我通过 JDBC 使用字符串文字 不是参
  • 如何将MySQL表中的日常记录存储到另一个表中?

    朋友们 我创建了一个 mysql 表来获取我网站的页面访问量 我的桌子是这样的 statistics table stat id visited page visit count 每次访问 visit count 都会加一 这很完美 但现在
  • 如何更改JavaFX中的突出显示颜色?

    如何更改JavaFX中的突出显示颜色 通常它是带有渐变的蓝色 但我想要绿色突出显示 我已经尝试过以下方法 root fx shadow highlight color CCFF99 感谢帮助 Look at 里海 css JavaFX 2
  • EF 迁移:回滚上次应用的迁移?

    这看起来是一个非常常见的任务 但我找不到简单的方法来完成它 我想撤消上次应用的迁移 我本来期望一个简单的命令 比如 PM gt Update Database TargetMigration 1 相反 我能想到的是 PM gt Get Mi
  • 如何增加 Oxyplot 中轴的绘图区域?

    我正在编写一个实用程序来通过电子邮件发送堆积柱形图 该柱形图显示每个人的任务 现在我正在使用PngExporter in OxyPlot WindowsForms导出绘图 但我似乎无法弄清楚如何控制图像的下限 用户名可能很长并且会溢出到外面
  • 通过我的应用程序更新和删除 Android 中的日历事件

    谁能告诉我我该怎么做修改 编辑 和删除android日历事件这是用户自己使用我的 Android 应用程序添加的 我已经尝试了很多 但没有一个对我来说效果很好 我是第一次处理这些日历 我们有解决方案吗 看看这个问题 堆栈溢出 https s
  • android - 上传文件时发送参数

    我有这段代码http pastebin com VrMNuxcv http pastebin com VrMNuxcv它成功地将文件从我的 android 上传到服务器 不过 我希望能够随它一起发送几个字符串参数 如果可能的话 您能否告诉我
  • 在 html 字符串中渲染 ViewComponent

    假设我有一个名为 MyComponent 的 ViewComponent 从 ASP NET Core 1 1 开始 我可以通过在 razor view cshtml 页面中编写此 ViewComponent 来呈现此 ViewCompon
  • 在 Scilab 中求解 ODE

    我正在尝试做一些电路分析Scilab通过解决一个ODE 但我需要改变一个ODE取决于函数的当前值 我已经实施了该解决方案Scala using RK4方法并且效果完美 现在我正在尝试做同样的事情 但是使用标准函数Scilab 但它不起作用
  • 如何在 Delphi 7 中使用 Indy 10 进行 NTLM 身份验证?

    我想在 Delphi 7 中使用 Indy 10 组件进行 NTLM 身份验证 这是我的源代码 uses Windows Messages SysUtils Variants Classes Graphics Controls Forms