如何通过服务主体实现Azure应用服务与PostgreSQL无交互连接
无交互实现Azure应用服务通过服务主体连接Azure PostgreSQL单服务器
前提准备
- 已部署Azure应用服务与Azure PostgreSQL单服务器
- 已注册Azure AD服务主体(应用程序)
- 服务主体已加入具备PostgreSQL访问权限的Azure AD组(或直接为服务主体配置数据库权限)
步骤1:配置服务主体的数据库访问权限
- 使用Azure AD管理员身份登录PostgreSQL服务器(可通过Azure门户的「查询编辑器」或本地客户端)。
- 若直接给服务主体授权,执行以下SQL:
若通过Azure AD组授权,先创建组对应的数据库角色,再将服务主体加入AD组:CREATE ROLE "<服务主体应用ID>" WITH LOGIN IN ROLE azure_ad_user; GRANT CONNECT ON DATABASE "<目标数据库名>" TO "<服务主体应用ID>"; -- 按需分配更细粒度权限,例如: GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO "<服务主体应用ID>";CREATE ROLE "<AD组显示名>" WITH LOGIN IN ROLE azure_ad_user; GRANT CONNECT ON DATABASE "<目标数据库名>" TO "<AD组显示名>";
步骤2:启用应用服务的系统托管身份(无密钥无交互核心)
- 进入Azure门户的应用服务资源,打开「身份」选项卡。
- 在「系统分配」标签页,开启身份状态为「开启」,点击保存。
- 记录生成的「对象ID」,后续无需手动使用,仅作验证用。
步骤3:代码中实现无交互令牌获取与数据库连接
以.NET为例,使用Azure.Identity和Npgsql包实现自动令牌获取:
using Azure.Identity; using Npgsql; using System.Threading.Tasks; public async Task ConnectWithManagedIdentity() { // 自动使用应用服务的系统托管身份获取令牌,无需用户交互或密钥 var credential = new DefaultAzureCredential(); var tokenRequestContext = new Azure.Core.TokenRequestContext(new[] { "https://ossrdbms-aad.database.windows.net/.default" }); var tokenResult = await credential.GetTokenAsync(tokenRequestContext); // 构造基础连接字符串(不含密码) var connectionString = "Host=your-postgres-server.postgres.database.azure.com;Database=your-db;Port=5432;Ssl Mode=Require"; await using var conn = new NpgsqlConnection(connectionString); // 将令牌作为密码传入 conn.ProvidePasswordCallback = (_, args) => args.Password = tokenResult.Token; await conn.OpenAsync(); // 后续执行数据库操作... }
- 其他语言逻辑类似:通过对应SDK获取托管身份令牌,将令牌作为密码传入PostgreSQL连接。
- 若使用用户托管身份,只需在
DefaultAzureCredential中指定ManagedIdentityClientId参数即可。
关键注意事项
- 必须先为PostgreSQL服务器设置Azure AD管理员,否则无法启用AD身份验证。
- 令牌作用域固定为
https://ossrdbms-aad.database.windows.net/.default,不可修改。 - 应用服务无需配置任何密钥或客户端ID,
DefaultAzureCredential会自动识别环境中的托管身份。
内容的提问来源于stack exchange,提问作者Asfourhundred
相关产品推荐
相关产品推荐

