如何通过托管身份从Azure Function连接Azure SQL且连接字符串无凭证
Azure Function(Linux .NET Core 3.x)通过托管身份连接Azure SQL 配置方案
前置依赖修正
- 完全弃用
System.Data.SqlClient,改用Microsoft.Data.SqlClient,版本要求≥2.1.0 - 额外安装NuGet包
Microsoft.Azure.Services.AppAuthentication,用于获取托管身份的访问令牌
正确连接字符串
连接字符串不需要加Authentication参数,配置如下:
Server=tcp:my-database-server.database.windows.net,1433;Database=my-database;Encrypt=Yes;TrustServerCertificate=no;Connection Timeout=30;
必须补充的代码逻辑
Linux环境下无法通过连接字符串参数自动获取托管身份令牌,需要手动获取令牌后赋值给数据库连接对象,示例代码如下:
using Microsoft.Azure.Services.AppAuthentication; using Microsoft.Data.SqlClient; using System.Threading.Tasks; public async Task YourFunctionLogic() { // 获取托管身份的Azure SQL访问令牌 var tokenProvider = new AzureServiceTokenProvider(); string sqlAccessToken = await tokenProvider.GetAccessTokenAsync("https://database.windows.net/"); // 初始化数据库连接 using var sqlConn = new SqlConnection("你配置的上述连接字符串"); // 手动绑定访问令牌 sqlConn.AccessToken = sqlAccessToken; await sqlConn.OpenAsync(); // 后续执行你的数据库操作 }
权限校验项
请确认以下配置没有遗漏:
- 执行的数据库用户创建与授权语句正确,示例:
CREATE USER [你的Azure AD组名称] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [你的Azure AD组名称]; ALTER ROLE db_datawriter ADD MEMBER [你的Azure AD组名称];
- Function应用的系统分配托管身份已成功加入该Azure AD组,组权限生效最多有2分钟延迟,刚加入可稍等后再测试。
之前尝试失败的原因说明
- 无身份信息的连接字符串:没有携带任何验证凭据,数据库无法识别访问身份,因此报
Login failed for user '' - 使用
System.Data.SqlClient加Authentication参数:该类库原生不支持Azure AD验证相关的参数,因此报关键字不支持错误 - 加
Authentication=Active Directory Integrated参数:该参数仅适用于Windows环境下的AD用户验证场景,Linux环境下MSAL无法自动获取当前用户身份信息,因此报UPN相关错误。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

