【问题标题】:Problem with PostgresSQL password authentication failed for user when trying to access or fetch data from database?尝试从数据库访问或获取数据时,用户的 PostgreSQL 密码身份验证失败?
【发布时间】:2022-02-10 17:20:47
【问题描述】:

我在尝试从 postgressql 获取数据时遇到问题。我正在使用 .NET Core 5.0 和 postgressql 作为我的数据库解决方案来使用微服务架构。

我正在尝试使用 docker 容器将我的应用程序容器化。在我尝试通过 API 获取一些数据之前,一切正常。

我遇到了这种类型的错误:

Npgsql.PostgresException (0x80004005): 28P01: password authentication failed for user "admin"
   at Npgsql.NpgsqlConnector.<ReadMessage>g__ReadMessageLong|194_0(NpgsqlConnector connector, Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage)
   at Npgsql.NpgsqlConnector.AuthenticateMD5(String username, Byte[] salt, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlConnector.Authenticate(String username, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
   at Npgsql.ConnectorPool.OpenNewConnector(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
   at Npgsql.ConnectorPool.<>c__DisplayClass38_0.<<Rent>g__RentAsync|0>d.MoveNext()
--- End of stack trace from previous location ---
   at Npgsql.NpgsqlConnection.<>c__DisplayClass41_0.<<Open>g__OpenAsync|0>d.MoveNext()
--- End of stack trace from previous location ---
   at Dapper.SqlMapper.QueryRowAsync[T](IDbConnection cnn, Row row, Type effectiveType, CommandDefinition command) in /_/Dapper/SqlMapper.Async.cs:line 472

从后端来看,情况很简单,我试图通过 productName 获取数据:

public async Task<Coupon> GetDiscount(string productName)
    {
        using var connection = new NpgsqlConnection
            (_configuration.GetValue<string>("DatabaseSettings:ConnectionString"));

        var coupon = await connection.QueryFirstOrDefaultAsync<Coupon>
            ("SELECT * FROM Coupon WHERE ProductName = @ProductName", new { ProductName = productName });

        if (coupon == null)
            return new Coupon 
            { ProductName = "No Discount", Amount = 0, Description = "No Discount Desc" };

        return coupon;
    }

我的 appsettings.json 文件,或者更准确地说是与 postgressql 的连接字符串是这样的:

 "DatabaseSettings": {
    "ConnectionString": "Server=localhost;Port=5432;Database=DiscountDb;User Id=admin;Password=admin1234;"
  },

在 docker compose 覆盖 yml 文件中我有:

discountdb:
    container_name: discountdb
    environment:
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin1234
      - POSTGRES_DB=DiscountDb
    restart: always
    ports:
        - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data/

如我所见,在我的搬运工中,我可以看到 discountdb 已启动并正在运行

我错过了一些东西,我不知道是什么。

【问题讨论】:

  • 好吧,要么没有设置密码,要么与您使用的密码不同。

标签: postgresql docker .net-core


【解决方案1】:

在容器中运行应用程序时,您可能需要更新连接字符串。我假设您无法访问数据库。

您正在根据appsettings.json 在应用程序内引用 localhost,除非您已覆盖连接字符串。容器中的 localhost 是它自己的上下文。

所以,您的连接字符串如下所示。

"Server=localhost;Port=5432;Database=DiscountDb;User Id=admin;Password=admin1234;"

但它应该看起来像这样(来自 docker compose 的 docker 网络将解析名称):

"Server=discountdb;Port=5432;Database=DiscountDb;User Id=admin;Password=admin1234;"

因此,在您的pgadmin 服务下的 docker compose 文件中,如果您还没有环境部分,您可以添加一个环境部分,以覆盖连接字符串。

environment:
  - DatabaseSettings:ConnectionString="Server=discountdb;Port=5432;Database=DiscountDb;User Id=admin;Password=admin1234;"

可能在覆盖中没有"

【讨论】:

    【解决方案2】:

    您的计算机上的 5432 端口上似乎有另一个 PostgreSQL 实例在本地运行。所以你调用这个服务器而不是你的容器化服务器。 另一方面,Portainer 在您的 docker-compose 网络中运行,并按预期调用容器化服务。 您可以尝试在 docker-compose 文件中设置不同的端口。

    【讨论】:

    • 如果任何其他进程正在使用端口 5432,则 Docker 无法在此端口运行容器。但是容器正在运行。
    • 由于某种原因 docker-compose up 在这种情况下不会抛出错误。 macos 上的同样问题:stackoverflow.com/questions/50108226/… 我也在 win10 上遇到了这种行为
    【解决方案3】:

    我遇到了同样的问题,我花了超过 1 周的时间试图寻找解决方案。我认为我们遵循相同的教程,因为当我阅读您的代码时,这与我的完全一样。 好吧,我只是更改了文件“appsettings.json”

    "Server=您的 PC 名称;Port=5432;Database=DiscountDb;User Id=admin;Password=admin1234;"

    不要使用 localhost 替换您的 PC 名称。

    【讨论】:

    • 此解决方案已在this answer 中提出。在回答老问题时,请确保您的回答对问答提供了独特而有价值的贡献。
    【解决方案4】:

    检查您的计算机上是否运行了 PostgreSQL 实例,然后停止服务,它会使用相同的教程正常运行 lm 并停止我本地安装的 postgressql 服务

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 1970-01-01
      • 2014-05-18
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 2011-12-03
      • 2021-06-19
      相关资源
      最近更新 更多