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

.NET 7+Npgsql连接Docker中PostgreSQL时用户app认证失败求助

问题解决:Npgsql连接PostgreSQL Docker容器时app用户密码认证失败

核心原因分析

你的连接问题本质是Docker容器内接收到的.NET应用连接来源并非127.0.0.1,而是Docker网关IP(如172.17.0.1),因此匹配的是pg_hba.conf最后一行的scram-sha-256认证规则,而非本地trust规则。同时手动创建app用户时的密码哈希可能未正确适配PostgreSQL 15默认的SCRAM认证标准。

解决方案

方案1:重置app用户密码为SCRAM-SHA-256哈希(推荐)

PostgreSQL 15默认使用SCRAM-SHA-256加密密码,手动创建用户时需确保密码采用该格式:

  1. 进入PostgreSQL容器:
docker exec -it db psql -U postgres
  1. 在psql中执行重置密码命令:
ALTER ROLE app WITH LOGIN PASSWORD 'password' ENCRYPTED USING 'scram-sha-256';
  1. 无需修改pg_hba.conf,直接重启.NET应用测试连接。

方案2:调整pg_hba.conf适配Docker网关IP

如果需要保留现有密码格式,可针对Docker网关IP单独配置认证规则:

  1. 查看Docker容器的网关IP:
docker inspect db | grep Gateway

得到类似172.17.0.1的地址。
2. 修改容器内的pg_hba.conf,在最后一行前添加:

# 允许Docker网关IP的app用户使用SCRAM认证
host    all             app             172.17.0.1/32            scram-sha-256

或使用MD5认证(仅测试环境推荐):

host    all             app             172.17.0.1/32            md5
  1. 重载PostgreSQL配置使修改生效:
docker exec db pg_ctl reload -D /var/lib/postgresql/data

方案3:容器初始化时自动创建符合规范的用户(最佳实践)

避免手动操作导致的配置不一致,通过初始化脚本在容器启动时自动创建用户:

  1. 创建init-db.sh脚本:
#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE DATABASE mydb WITH TEMPLATE template0;
    CREATE ROLE app WITH LOGIN PASSWORD 'password' ENCRYPTED USING 'scram-sha-256';
    GRANT CONNECT ON DATABASE mydb TO app;
    GRANT USAGE ON SCHEMA public TO app;
    GRANT SELECT ON ALL TABLES IN SCHEMA public TO app;
    GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO app;
    ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO app;
EOSQL
  1. 启动容器时挂载该脚本:
docker run --name db -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 -v $(pwd)/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh postgres

额外检查点

  • 确保Npgsql连接字符串未强制指定旧版认证方式,appsettings.json配置示例:
{
  "ConnectionStrings": {
    "DefaultConnection": "Host=localhost;Database=mydb;Username=app;Password=password"
  }
}
  • 修改pg_hba.conf后必须重载或重启PostgreSQL,否则配置不会生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:44:55