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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:34:59