我正在使用 Npgsql,我想知道是否有一种方法可以使用自动回退到公共(public)登录的集成安全性来连接到 PostgreSQL 服务器?或者也许有另一种方法可以实现我想要实现的目标。
我有一个使用 Windows 身份验证的 ASP.NET 网站 (IIS7.5),并且我已将 PostgreSQL 配置为允许通过 SSPI 进行访问,只要数据库中存在具有正确名称的角色,这就可以正常工作。该网站可供 Intranet 上的每个人查看,但一些用户具有一些其他人不应该具备的额外能力(或可以看到额外数据)。
目前,我正在使用如下内容:
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 连接并查询是否存在合适的集成安全角色并重新连接,但这似乎比上面的更麻烦。
最佳答案
我在您的代码中没有看到任何密码。您是否使用任何安全措施?
如果你不想在你的源代码中嵌入密码(这是正确的),你应该在你的主目录中创建 ~/.pgpass
文件(%appdata%/postgresql/pgpass.conf
在 Windows 上)有 1 个或多个这样的行:
hostname:port:database:username:password
这将允许任何使用 libpq(包括 npgsql)的程序在任何连接尝试时从 .pgpass 中查找密码。
如果这将在 www-data 用户下运行,.pgpass 应该在它的主目录中创建(但是一定要配置你的网络服务器永远不要提供这个文件!)
我认为这样做也应该解决您似乎拥有的连接池问题。
关于postgresql - 使用集成安全性连接到 PostgreSQL 或回退到公共(public)登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13115977/