簡體   English   中英

嘗試從數據庫訪問或獲取數據時,用戶的 PostgresSQL 密碼身份驗證失敗的問題?

[英]Problem with PostgresSQL password authentication failed for user when trying to access or fetch data from database?

嘗試從 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

從后端的角度來看,我嘗試通過產品名稱獲取數據的情況非常簡單:

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 中編寫覆蓋 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/

正如我所見,在我的 portainer 中我可以看到 discountdb 已啟動並正在運行在此處輸入圖像描述

我錯過了一些東西,我不知道是什么。

檢查您的計算機上是否正在運行 PostgreSQL 實例,然后停止服務,它會使用相同的教程正常工作 lm 並停止我本地安裝的 postgressql 服務

在容器中運行應用程序時,您可能需要更新連接字符串。 我假設您無法訪問數據庫。

您正在根據appsettings.json從應用程序內引用localhost ,除非您已覆蓋連接字符串。 容器中的 localhost 是它自己的上下文。

因此,您的連接字符串如下所示。

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

但它可能看起來像這樣(來自 docker 組合的 docker 網絡將解析名稱):

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

因此,在您的pgadmin服務下的 docker 撰寫文件中,如果您還沒有環境部分,您可以添加一個環境部分,以覆蓋連接字符串。

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

可能應該沒有"覆蓋。

看起來您在計算機的 5432 端口上本地運行了另一個 PostgreSQL 實例。 所以你調用這個服務器而不是你的容器化服務器。 另一方面,Portainer 在您的 docker-compose 網絡中運行,並按預期調用容器化服務。 您可以嘗試在 docker-compose 文件中設置不同的端口。

我遇到了同樣的問題,我花了超過 1 周的時間試圖尋找解決方案。 我認為我們遵循相同的教程,因為當我閱讀您的代碼時,這與我的完全一樣。 好吧,我只是更改了文件“appsettings.json”

"服務器=您的 PC 名稱;端口=5432;數據庫=DiscountDb;用戶 ID=admin;密碼=admin1234;"

不要使用 localhost 替換您的 PC 名稱。

我首先在 appsettings.json 中為我找到了解決方案,添加服務器名稱(可能是 postgres 數據庫容器名稱)和 Host=localhost:

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

然后你需要檢查是否有任何服務器在運行端口 5432 通常如果你的計算機中安裝了 Postgres 默認端口是 5432 所以你需要停止它。

如果您使用的是 windows,則要殺死的命令:

taskkill /PID <port value> /F

然后再次運行應用程序。

在我的例子中,我已經從我自己的本地機器上刪除了 PostgreSQL Db,因為我建議我在添加本地 PostgreSQL Db 時配置了另一個密碼。 我現在用的是Docker,沒必要用local Db。

只需刪除,重新安裝,然后嘗試再次運行 Postgresql。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM