You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delphi XE3 VCL应用中实现Microsoft Entra ID认证及组检查?

Delphi XE3 VCL应用迁移至Microsoft Entra ID认证方案

一、认证流程选择

优先采用OAuth 2.0授权码流(带PKCE)——这是微软官方推荐的原生桌面应用认证方式,安全性远高于直接使用用户名密码的ROPC流,也符合Entra ID的合规要求。

二、OAuth2/OIDC在Delphi XE3中的实现

Delphi XE3无原生OAuth支持,可通过以下两种方式实现:

1. 基于Indy手动实现

利用XE3自带的Indy 10组件处理HTTP请求,核心步骤:

  • 生成PKCE参数:用THashSHA2生成code_verifier的SHA256哈希作为code_challenge,指定code_challenge_method=S256。
  • 构造授权URL,调用系统默认浏览器打开Entra ID授权端点,参数包含client_id、redirect_uri(推荐用自定义协议如myapp://auth,或本地端口回调http://localhost:xxxx)、response_type=code、scope=User.Read GroupMember.Read.All等。
  • 监听回调:若用本地端口,启动Indy的TIdHTTPServer监听指定端口接收授权码;若用自定义协议,需在Windows注册表中注册协议,让系统将回调请求转发至应用。
  • 换取令牌:携带授权码、code_verifier、client_id、redirect_uri向Entra ID令牌端点发送POST请求,获取access_token和id_token。

2. 第三方组件辅助

找兼容XE3的开源OAuth2客户端组件(如DelphiOAuth2的旧版本),减少手动编码量,但需注意组件的TLS兼容性。

三、调用Microsoft Graph API验证组成员身份

拿到access_token后,通过Indy发送HTTP请求调用Graph API:

核心请求示例

var
  IdHTTP: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  Response: string;
begin
  IdHTTP := TIdHTTP.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
  try
    // 强制使用TLS 1.2,适配Entra ID要求
    SSLHandler.SSLOptions.SSLVersions := [sslvTLSv1_2];
    IdHTTP.IOHandler := SSLHandler;
    
    // 设置授权头
    IdHTTP.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + AccessToken);
    
    // 检查用户是否属于指定组(替换{group-id}和{user-id})
    try
      Response := IdHTTP.Get('https://graph.microsoft.com/v1.0/groups/{group-id}/members/{user-id}/$ref');
      // 返回204 No Content → 用户是组成员
      ShowMessage('用户已授权');
    except
      on E: EIdHTTPProtocolException do
      begin
        if E.ErrorCode = 404 then
          ShowMessage('用户不在指定组内')
        else
          raise;
      end;
    end;
  finally
    IdHTTP.Free;
  end;
end;

权限配置

在Entra ID应用注册中添加委托权限(User.Read、GroupMember.Read.All)并完成管理员同意;若需后台无交互验证,可添加应用权限(GroupMember.Read.All)。

四、XE3适配关键点

  • TLS版本适配:Entra ID要求TLS 1.2+,需手动配置Indy的SSLHandler指定TLS 1.2。
  • JSON解析:用XE3自带的DBXJSON或开源的SuperObject库解析令牌和Graph API响应。
  • 自定义协议注册:若使用自定义协议作为回调URI,需在注册表HKEY_CLASSES_ROOT下添加协议项,示例:
    [HKEY_CLASSES_ROOT\myapp]
    @="URL:MyApp Auth Protocol"
    "URL Protocol"=""
    [HKEY_CLASSES_ROOT\myapp\shell\open\command]
    @="\"C:\\Path\\To\\YourApp.exe\" \"%1\""
    

内容的提问来源于stack exchange,提问作者PDM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:43:18