使用Tedious与MSI连接Azure函数应用和SQL Server出现身份验证错误如何解决
问题排查方案
1. 代码层面错误修正
你代码里的首要问题是连接配置的键名大小写错误,Tedious的连接配置中身份验证字段为小写authentication,你写的大写Authentication会被Tedious忽略,导致默认走SQL账号密码认证,因此抛出空用户名登录失败的错误。
修正后的配置示例如下:
const config = { server: 'XXXXXX.public.XXXXXX.database.windows.net', // 改为小写的authentication authentication: { type: 'azure-active-directory-msi-app-service', // 如果使用用户分配的MSI,需要额外添加以下配置 // options: { // clientId: "<用户分配MSI的客户端ID>" // } }, options: { database: 'YYYYY', encrypt: true, port: 3342, connectTimeout: 120000 } }
另外建议升级Tedious到最新稳定版,旧版本对AAD MSI认证的支持存在已知兼容问题。
2. Azure SQL侧配置检查
- 确认已使用AAD管理员账号登录SQL数据库,为函数MSI创建了对应账号并分配权限:
-- 创建外部用户,名称和函数应用的MSI显示名称完全一致 CREATE USER [<函数应用名称>] FROM EXTERNAL PROVIDER; -- 分配所需权限,示例为读权限,按需调整 ALTER ROLE db_datareader ADD MEMBER [<函数应用名称>]; ALTER ROLE db_datawriter ADD MEMBER [<函数应用名称>]; -- 如需写权限再加
- 确认SQL服务器已配置AAD管理员,可在Azure门户SQL服务器的「Azure Active Directory」菜单中查看配置状态。
- 确认SQL服务器防火墙允许Azure服务访问,或已将函数应用的所有出站IP添加到SQL防火墙白名单。
3. 函数应用侧配置检查
- 确认函数应用的「标识」菜单中,你使用的托管标识(系统分配/用户分配)已处于启用状态。
- 如果使用用户分配的MSI,需要确保代码中已配置对应的客户端ID参数。
内容的提问来源于stack exchange,提问作者ochao
相关产品推荐
相关产品推荐

