Dataverse(TDS端点)非交互式登录:Laravel对接Dynamics表认证问题
实现Laravel通过服务器到服务器认证访问Dynamics TDS端点
可以实现服务器到服务器的非交互式认证,无需依赖带MFA的交互式登录,以下是两种适合Laravel场景的可行方案:
方案1:Azure AD服务主体认证
这是通用的非交互式认证方式,适用于任何部署环境:
- 在Azure AD中创建一个服务主体,并为其分配Dynamics目标数据库的
db_datareader权限(满足只读需求即可)。 - 配置Laravel的
config/database.php中的SQL Server连接:'dynamics' => [ 'driver' => 'sqlsrv', 'host' => '你的TDS端点地址', 'database' => '目标数据库名称', 'username' => '服务主体的客户端ID', 'password' => '服务主体的客户端密钥', 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'options' => [ PDO::SQLSRV_ATTR_FEDERATED_AUTHENTICATION => PDO::SQLSRV_FEDERATED_AUTHENTICATION_AAD, ], ], - 可以先用
sqlcmd验证认证是否生效:
(sqlcmd -S <你的TDS端点> -d <数据库名> -U <服务主体客户端ID> -P <客户端密钥> -G-G参数指定使用Azure AD认证)
方案2:Azure托管身份认证(仅限Azure部署场景)
如果你的Laravel应用部署在Azure资源(如App Service、VM、AKS等)上,推荐使用托管身份,无需管理密钥:
- 为你的Azure资源启用系统分配/用户分配托管身份,并给该身份分配Dynamics数据库的
db_datareader权限。 - 配置Laravel数据库连接,无需用户名密码,直接通过托管身份认证:
'dynamics' => [ 'driver' => 'sqlsrv', 'host' => '你的TDS端点地址', 'database' => '目标数据库名称', 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'options' => [ PDO::SQLSRV_ATTR_FEDERATED_AUTHENTICATION => PDO::SQLSRV_FEDERATED_AUTHENTICATION_AAD_MSI, // 若使用用户分配的托管身份,需添加以下参数 // PDO::SQLSRV_ATTR_AAD_MSI_CLIENT_ID => '托管身份的客户端ID', ], ],
关键注意事项
- 确保TDS端点支持Azure AD非交互式认证:大部分通过Azure暴露的Dynamics TDS端点默认支持,但如果是自建的端点,需确认已开启AAD认证配置。
- 确保Laravel使用的
pdo_sqlsrv扩展版本足够新(推荐5.9+),以支持AAD认证相关的PDO属性。 - 编写Laravel模型时,直接指定Dynamics对应的表名即可:
class DynamicsTable extends Model { protected $table = '你的Dynamics表名'; // 若表无主键,可设置$primaryKey = null; $incrementing = false; }
内容的提问来源于stack exchange,提问作者Kennon Young
相关产品推荐
相关产品推荐

