[pgsql-jp: 41552] Npgsql で PostgreSQL に SSPI 認証で接続する際の問題

中西剛紀 naka24nori @ gmail.com
2014年 1月 24日 (金) 10:17:12 JST


中西と申します。

Npgsql(.Net Data Provider for Postgresql)を使って
PostgreSQLにSSPI認証で接続するケースの質問です。

【前提】
・使用マシンは2台(PostgreSQLサーバとクライアントマシン)
・PostgreSQLサーバの環境情報
  OS: Windows7 32bit
  DB: PostgreSQL 9.2.6 を EnterpriseDB 社のバイナリパッケージでインストール
・クライアントマシンの環境情報
  OS: Windows7 64bit
  開発ツール: Microsoft Visual Studio Express 2013 for Windows Desktop
  接続ドライバ: Npgsql 2.0.14.3
 DB: psqlを使うため、PostgreSQL 9.2.6 を EnterpriseDB 社の
         バイナリパッケージでインストール
・PostgreSQLサーバとクライアントマシンは同一のWindowsドメイン上にある。
・PostgreSQLサーバの pg_hba.conf は以下レコードを設定し、SSPI認証のみを許可
-----------------------------------------------
host all all 0.0.0.0/0 sspi
host all all ::1/0 sspi
-----------------------------------------------
・PostgreSQLサーバのWindowsファイアーウォールは一時的に停止し、
  全てのポートへのアクセスを許可
・PostgreSQLサーバにWindowsドメインのログインユーザーと同名のロールを追加済
----------------------------------------------------------------------------
CREATE ROLE (Windowsユーザー名) WITH LOGIN;
----------------------------------------------------------------------------

【NpgsqlでDB接続するアプリのソースコード(抜粋)】
string connstr =
"Server=(PostgreSQLサーバのIP);Port=5432;Database=(DB名);Integrated Security= true;"
NpgsqlConnection conn = new NpgsqlConnection(connstr);
conn.Open();
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "select * from pg_locks";
command.ExecuteScalar();
conn.Close();

【発生事象】
1. クライアントマシンからPostgreSQLサーバへpsqlで接続 ⇒ 接続OK
--------------------------------------------------------------------------------------------------------------------------
[クライアントマシンでの実行コマンド]
> psql -h (PostgreSQLサーバのIP) -d (接続するデータベース名)
[接続時のPostgreSQLサーバログ]
2014-01-21 17:08:38 JST LOG:  connection received: host=(クライアントマシンのIP)
port=56499
2014-01-21 17:08:38 JST LOG:  connection authorized:
user=(Windowsドメインユーザ) database=(DB名)
--------------------------------------------------------------------------------------------------------------------------
2. クライアントマシンからPostgreSQLサーバへNpgsqlで接続 ⇒ 接続NG
--------------------------------------------------------------------------------------------------------------------------
[接続時のPostgreSQLサーバログ]
2014-01-21 17:08:51 JST LOG:  connection received: host=(クライアントマシンのIP)
port=56501
2014-01-21 17:08:51 JST FATAL:  could not accept SSPI security context
2014-01-21 17:08:51 JST DETAIL:  この関数に提供されたトークンは無効です
(80090308)
--------------------------------------------------------------------------------------------------------------------------
3. クライアントマシンの中で動かしたPostgreSQLサーバへNpgsqlで接続 ⇒ 接続OK
--------------------------------------------------------------------------------------------------------------------------
[接続時のPostgreSQLサーバログ]
2014-01-22 14:20:54 JST LOG:  connection received: host=127.0.0.1 port=57690
2014-01-22 14:20:54 JST LOG:  connection authorized:
user=(Windowsドメインユーザ) database=(DB名)
--------------------------------------------------------------------------------------------------------------------------

※同一条件で 「psqlならSSPI認証OK」「NpgsqlならSSPI認証NG」なので、
  Npgsql に何か問題があるのではと推測しています。

【確認したいこと】
2.のケースで接続できるようにしたいので、
・接続NGの原因を調査するための方法
・同様のケースに遭遇されたことがあればその時の対処方法
について、わかる方がいらっしゃれば回答いただきたいと思っています。

当方WindowsやSSPI認証の知識が乏しいため、Windowsの世界では
初歩的/的外れな質問かもしれませんがよろしくお願いいたします。

-- 
---------------------------------------------------------
中西 剛紀 Yoshinori Nakanishi
naka24nori @ gmail.com


pgsql-jp メーリングリストの案内