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

如何通过服务主体实现Azure应用服务与PostgreSQL无交互连接

无交互实现Azure应用服务通过服务主体连接Azure PostgreSQL单服务器

前提准备

  • 已部署Azure应用服务与Azure PostgreSQL单服务器
  • 已注册Azure AD服务主体(应用程序)
  • 服务主体已加入具备PostgreSQL访问权限的Azure AD组(或直接为服务主体配置数据库权限)

步骤1:配置服务主体的数据库访问权限

  1. 使用Azure AD管理员身份登录PostgreSQL服务器(可通过Azure门户的「查询编辑器」或本地客户端)。
  2. 若直接给服务主体授权,执行以下SQL:
    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>";
    
    若通过Azure AD组授权,先创建组对应的数据库角色,再将服务主体加入AD组:
    CREATE ROLE "<AD组显示名>" WITH LOGIN IN ROLE azure_ad_user;
    GRANT CONNECT ON DATABASE "<目标数据库名>" TO "<AD组显示名>";
    

步骤2:启用应用服务的系统托管身份(无密钥无交互核心)

  1. 进入Azure门户的应用服务资源,打开「身份」选项卡。
  2. 在「系统分配」标签页,开启身份状态为「开启」,点击保存。
  3. 记录生成的「对象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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:42:20