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

已启用Azure AD的Azure PostgreSQL灵活服务器:如何解决应用重启/令牌过期后无法访问问题

问题场景

我部署了Azure PostgreSQL灵活服务器,并且仅启用了Azure AD认证,该认证支持基于令牌的身份验证。我可以通过分配给服务器AD用户的服务主体,使用以下命令登录:

az login --service-principal -u "ID" -p "SECRET" --tenant "TENANT"
export PGPASSWORD=$(az account get-access-token --resource-type oss-rdbms --query "[accessToken]" -o tsv)
psql "host=mydatabase.database.azure.com user=service-principal dbname=db sslmode=require"

但当我用以下PostgreSQL环境变量配置应用后:

pg_host='mydatabase.database.azure.com'
pg_port='5432'
pg_database='access-token'
pg_username='service-principal'
pg_password='<password>'
pg_sslmode='require'

遇到了问题:访问令牌每60分钟过期,仅在当前会话有效。如果VM重启,应用就无法连接数据库,必须重新登录并更新pg_password为新令牌。

请问针对灵活服务器和Azure AD登录,除了设置cron在VM重启时更新变量,还有什么基于Azure AD的方案可以解决这个问题?


解决方案

以下是几种更贴合Azure生态的优雅方案,替代手动或cron更新令牌的方式:

1. 用Azure托管标识(Managed Identity)自动获取令牌

如果你的应用部署在Azure资源(VM、App Service、AKS等)上,优先用托管标识——它不需要手动维护服务主体密钥,还能自动安全地获取令牌:

  • 给你的VM(或应用所在资源)分配系统分配或用户分配的托管标识
  • 在Azure PostgreSQL灵活服务器中,将该托管标识添加为AD用户(或对应权限角色的成员)
  • 在VM内部,无需执行az login,直接通过Azure实例元数据服务(IMDS)获取令牌:
    export PGPASSWORD=$(curl -s "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://ossrdbms-aad.database.windows.net/" -H "Metadata: true" | jq -r .access_token)
    
    可以把这段命令加到VM的启动脚本里,或者在应用启动前自动执行,甚至在应用代码里集成定时调用逻辑刷新令牌。

2. 在应用代码中集成令牌自动刷新逻辑

如果你的应用有代码控制权,直接用Azure官方SDK(比如Azure.Identity系列)来自动处理令牌的获取与刷新:

  • 以Python为例,用azure-identity库实现:
    from azure.identity import ClientSecretCredential
    import psycopg2
    
    # 初始化服务主体凭据
    credential = ClientSecretCredential(
        tenant_id="你的租户ID",
        client_id="你的服务主体ID",
        client_secret="你的服务主体密钥"
    )
    
    # 获取PostgreSQL的访问令牌(SDK会自动处理过期刷新)
    token = credential.get_token("https://ossrdbms-aad.database.windows.net/.default")
    
    # 建立数据库连接
    conn = psycopg2.connect(
        host="mydatabase.database.azure.com",
        database="access-token",
        user="service-principal",
        password=token.token,
        sslmode="require"
    )
    
    这类SDK会自动监控令牌有效期,临近过期时自动刷新,完全不需要手动干预。

3. 结合Azure Key Vault实现安全的密钥与令牌管理

把服务主体的敏感信息(ID、密钥、租户ID)存到Key Vault,再通过托管标识访问Key Vault,同时集成令牌刷新逻辑:

  • 将服务主体的相关信息作为机密存储到Azure Key Vault
  • 给应用所在的VM分配访问Key Vault机密的权限
  • 应用启动时从Key Vault拉取服务主体信息,再用Azure SDK获取令牌,并且定时刷新令牌更新数据库连接密码
    这种方式既避免了明文存储敏感信息,又能自动处理令牌过期问题。

4. 利用PostgreSQL驱动的原生Azure AD支持

部分PostgreSQL驱动直接支持Azure AD令牌的自动处理,比如.NET的Npgsql驱动,支持直接传入AccessToken参数,无需把令牌放到Password字段,还能配合Azure SDK自动完成令牌刷新。


内容的提问来源于stack exchange,提问作者philthy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:27:48