2

Npgsql を使用していますが、パブリック ログインに自動的にフォールバックする統合セキュリティを使用して PostgreSQL サーバーに接続する方法があるかどうか疑問に思っていました。または、私が達成しようとしていることを行う別の方法があるかもしれません。

Windows 認証を使用する ASP.NET Web サイト (IIS7.5) があり、SSPI 経由のアクセスを許可するように PostgreSQL を構成しました。データベースに正しい名前のロールがある限り、これは正常に機能します。この Web サイトは、イントラネット上のすべてのユーザーが表示できますが、一部のユーザーには、他のユーザーにはできないはずのいくつかの特別な機能 (または追加のデータを表示できる) があります。

現在、私は次のようなものを使用しています:

NpgsqlConnectionStringBuilder csb = new NpgsqlConnectionStringBuilder();

csb.Pooling = false; // if true, causes intermittent DB connection issues
csb.Database = "dbname";
csb.Host = "192.168.1.100";
csb.IntegratedSecurity = true;

dbconn.ConnectionString = csb.ConnectionString;

try
{
    dbconn.Connect();
}
catch (NpgsqlException ex)
{
    if (/* check for authentication failed */)
    {
        csb.IntegratedSecurity = false;
        csb.UserName = "www-read";
        dbconn.ConnectionString = csb.ConnectionString;
        dbconn.Open();
    }
}

これは正常に機能しますが、「www-read」ロールにフォールバックするたびに、認証エラーがあったことを示す重要なログ エントリが追加されます。これを回避できる唯一の方法は、常に www-read 経由で接続し、適切な統合セキュリティ ロールが存在するかどうかを問い合わせてから再接続することですが、上記よりもさらに面倒に思えます。

4

1 に答える 1

0

コードにパスワードがありません。セキュリティを使用していますか?

ソース コードにパスワードを埋め込みたくない場合 (当然のことですが)、~/.pgpassホーム ディレクトリ ( %appdata%/postgresql/pgpass.confWindows の場合) に次のような 1 行以上のファイルを作成する必要があります。

hostname:port:database:username:password

これにより、libpq (npgsql を含む) を使用しているすべてのプログラムが、接続の試行時に .pgpass からパスワードを検索できるようになります。

これが www-data ユーザーの下で実行される場合、.pgpass はそのホーム ディレクトリに作成する必要があります (ただし、このファイルを提供しないように Web サーバーを設定してください!)

これを行うと、接続プーリングの問題も修正されるはずです。

于 2012-10-29T07:35:51.207 に答える