使用Azure AD访问令牌从PHP连接AzureDB失败求助
PHP sqlsrv驱动通过Microsoft Entra Auth连接Azure DB失败排查
我按照微软官方文档的示例,使用sqlsrv驱动通过Microsoft Entra(原Azure AD)访问令牌连接Azure DB,脚本如下:
<?php $azureAdServer = 'xxx.crm4.dynamics.com,5558'; $accToken = 'xxx'; // 注意:原代码末尾的>是多余字符,需移除 $azureAdDatabase = 'xxx'; // 使用访问令牌连接:不要使用UID或PWD连接选项 // 假设$accToken是从OAuth JSON响应中提取的有效字符串 $connectionInfo = array("Database"=>$azureAdDatabase,"AccessToken"=>$accToken); $conn = sqlsrv_connect($azureAdServer, $connectionInfo); if ($conn === false) { echo "Could not connect with Azure AD Access Token.\n"; die( print_r( sqlsrv_errors(), true)); } else { echo "Connected successfully with Azure AD Access Token.\n"; sqlsrv_close($conn); } ?>
但始终收到错误提示:
Could not connect with Azure AD Access Token
已确认凭据正确,且通过C#代码可以正常连接,请问该脚本是否可行?
排查与解决要点
- 修正令牌格式:原代码中
$accToken末尾的>是无效字符,必须移除。确保令牌是从OAuth响应中直接提取的access_token字段值,未经过任何额外转义或编码。 - 验证令牌受众与权限:确认令牌的受众(
aud字段)与目标数据库匹配(针对Dynamics 365数据库,受众通常为https://crm.dynamics.com/),且令牌包含数据库访问所需的权限(如db_datareader),同时令牌未过期。 - 检查sqlsrv驱动版本:确保使用的sqlsrv驱动版本≥5.6.0,旧版本不支持
AccessToken参数认证方式。 - 补充连接参数:部分环境需要强制加密连接,可修改
connectionInfo添加以下参数:$connectionInfo = array( "Database" => $azureAdDatabase, "AccessToken" => $accToken, "Encrypt" => true, "TrustServerCertificate" => false ); - 测试网络连通性:确认PHP服务器能访问目标数据库的端口(5558),可通过
telnet xxx.crm4.dynamics.com 5558或类似命令验证。
脚本本身的逻辑结构是符合官方文档规范的,问题大概率出在令牌细节、驱动版本或连接参数的配置上。
内容的提问来源于stack exchange,提问作者opentux
相关产品推荐
相关产品推荐

