如何在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
相关产品推荐
相关产品推荐

