[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 メーリングリストの案内