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

ASP.NET Core 9 Web API中PostgreSQL托管身份刷新令牌未重置问题

解决ASP.NET Core 9 Web API中托管身份连接PostgreSQL的令牌过期问题

你的核心问题是启动时仅获取一次Azure AD令牌并写入连接字符串,导致令牌过期后无法自动刷新。正确的做法是让Npgsql在每次创建数据库连接时动态获取最新令牌,而非提前固化到连接字符串中。

具体实现步骤:

  1. 注册Azure身份验证服务
    先将DefaultAzureCredential注册为单例服务,利用其内置的令牌缓存和自动刷新机制:

    builder.Services.AddSingleton<DefaultAzureCredential>();
    
  2. 配置DbContext时动态注入令牌
    修改DbContext的配置逻辑,移除启动时拼接令牌的代码,改用Npgsql的ProvidePasswordCallback回调,每次创建连接时异步获取最新令牌:

    builder.Services.AddDbContext<MyDbContext>((serviceProvider, options) =>
    {
        var connectionString = builder.Configuration.GetConnectionString("db_conn_string")!;
        var environment = builder.Configuration["ASPNETCORE_ENVIRONMENT"];
        var credential = serviceProvider.GetRequiredService<DefaultAzureCredential>();
    
        options.UseNpgsql(connectionString, npgsqlOptions =>
        {
            // 仅非开发环境使用托管身份
            if (environment != "Development")
            {
                npgsqlOptions.ProvidePasswordCallback(async () =>
                {
                    var tokenResult = await credential.GetTokenAsync(
                        new TokenRequestContext(scopes: ["https://ossrdbms-aad.database.windows.net/.default"])
                    );
                    return tokenResult.Token;
                });
            }
        });
    });
    

方案说明:

  • DefaultAzureCredential单例注册后,会自动管理令牌的缓存和刷新,无需手动处理过期逻辑。
  • ProvidePasswordCallback是Npgsql提供的扩展点,每次建立新数据库连接时都会触发该回调,确保使用的是最新的有效令牌。
  • 开发环境仍使用原始连接字符串(带密码),非开发环境自动切换为托管身份令牌认证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:48:12