我有一个 .NET 7 应用程序,它使用 NPGSQL (v7.0.2) 连接到在 Docker 中运行的 PostgreSQL 数据库 (v15.2)。图片是直接从https://hub.docker.com/_/postgres拉取的。 .NET 应用程序未在容器中运行。
容器开始于:
docker run --name db -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
使用
psql -U postgres -h localhost
登录按预期工作。
容器启动后,我在容器内创建一个数据库和用户:
CREATE DATABASE mydb WITH TEMPLATE template0;
CREATE ROLE app WITH LOGIN PASSWORD 'password';
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;
.NET appsettings.json 中的 Config 是:
{
"Host": "localhost",
"Database": "mydb",
"Username": "app",
"Password": "password"
}
当我运行 .NET 应用程序时,日志显示:
Severity: FATAL
SqlState: 28P01
MessageText: password authentication failed for user "app"
File: auth.c
Line: 326
Routine: auth_failed
PostgreSQL 容器日志显示:
FATAL: password authentication failed for user "app"
DETAIL: Connection matched pg_hba.conf line 100: "host all all all scram-sha-256"
我可以用
psql -U app -h localhost -d mydb
登录
我尝试启动指定不同身份验证方法的容器:
docker run ... -e POSTGRES_INITDB_ARGS=--auth=scram-sha-256
docker run ... -e POSTGRES_INITDB_ARGS=--auth=md5
docker run ... -e POSTGRES_INITDB_ARGS=--auth=password
我还尝试将 pg_hba.config 中的匹配行更改为:
host all all all md5
host all all all password
如果我更改 .NET 配置以使用 postgres 用户,它会起作用。
{
"Host": "localhost",
"Database": "mydb",
"Username": "postres",
"Password": ""
}
作为参考,这里是容器中的 pg_hba.conf (/var/lib/postgresql/data/pg_hba.conf)
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
host all all all scram-sha-256
任何帮助表示赞赏。