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

Mac下用Rider通过C#(.NET 8)连接PostgreSQL时密码验证失败

PostgreSQL密码验证错误:程序使用当前系统用户而非连接字符串指定用户

我在Mac系统的JetBrains Rider中用C#开发.NET 8 Web API,通过Npgsql连接本地PostgreSQL实例。Rider里能添加并测试数据库连接,但程序运行初始化连接时一直报密码验证错误。

我的连接字符串:

Server=localhost;Port=5432;Database=movies;User Id=course;Password=password;

但异常信息显示程序在用我的系统用户名认证:

Unhandled exception. Npgsql.PostgresException (0x80004005): 28P01: password authentication failed for user "{my pc username}"

简化堆栈跟踪:

Npgsql.PostgresException (0x80004005): 28P01: password authentication failed for user "{my pc username}"
   at Npgsql.Internal.NpgsqlConnector.Authenticate(...)
   ...
   at Movies.Application.Database.NpgSqlConnectionFactory.CreateConnectionAsync() in /Users/dummyuser/Developer/DotNet/Movies/Movies.Application/Database/DbConnectionFactory.cs:line 25

 Exception data:
    Severity: FATAL
    SqlState: 28P01
    MessageText: password authentication failed for user "{my pc username}"
    File: auth.c
    Line: 321
    Routine: auth_failed

已做排查:

  • 反复核对连接字符串里的凭据(User Id=course;Password=changeme)
  • 确认PostgreSQL在运行,localhost:5432可访问
  • 在PostgreSQL中创建了course用户,能通过psql登录
  • 代码里没硬编码我的系统用户名凭据

可能的解决方法

  1. 确认连接字符串是否被正确读取
    在NpgSqlConnectionFactory.CreateConnectionAsync()方法里,打印或调试查看实际使用的连接字符串,排查是否存在配置覆盖或读取错误(比如配置文件键名写错、环境变量覆盖了配置项)。

  2. 修改PostgreSQL的认证配置
    本地连接可能默认用peer认证(自动匹配系统用户),导致忽略连接字符串里的用户名。找到PostgreSQL的pg_hba.conf文件(通常在/usr/local/var/postgres/或/Library/PostgreSQL/<版本>/data/目录下),将localhost对应的认证方式从peer改为scram-sha-256或md5:

    host    all             all             127.0.0.1/32            scram-sha-256
    host    all             all             ::1/128                 scram-sha-256
    

    修改后重启PostgreSQL服务:brew services restart postgresql(Homebrew安装的情况)。

  3. 检查用户名大小写匹配
    PostgreSQL用户名默认区分大小写,如果创建用户时用了双引号,连接字符串里也要对应格式。确认course是小写创建的,连接字符串里的User Id=course没有多余空格或大小写错误。

  4. 排查配置优先级问题
    .NET配置读取有优先级(环境变量>用户机密>appsettings.json等),如果其他配置源覆盖了你的连接字符串,会导致凭据错误。可以在启动时输出所有配置项,查看连接字符串的实际值。

  5. 直接硬编码连接字符串测试
    在CreateConnectionAsync方法里直接硬编码连接字符串,看是否能正常连接:

    public async Task<IDbConnection> CreateConnectionAsync()
    {
        var connection = new NpgsqlConnection("Server=localhost;Port=5432;Database=movies;User Id=course;Password=password;");
        await connection.OpenAsync();
        return connection;
    }
    

    如果这样能成功,说明问题出在配置读取环节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:52:46