2

我正在使用 Npgsql,我想知道是否有一种方法可以使用自动回退到公共登录的集成安全性连接到 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 连接并查询是否存在合适的集成安全角色并重新连接,但这似乎比上述更麻烦。

4

1 回答 1

0

我在您的代码中没有看到任何密码。您是否使用任何安全措施?

如果您不想将密码嵌入到您的源代码中(这是正确的),您应该~/.pgpass在您的主目录(%appdata%/postgresql/pgpass.conf在 Windows 上)中创建具有 1 行或更多行的文件,如下所示:

hostname:port:database:username:password

这将允许任何使用 libpq(包括 npgsql)的程序在任何连接尝试时从 .pgpass 中查找密码。

如果这将在 www-data 用户下运行,则应在其主目录中创建 .pgpass(但请确保将您的 Web 服务器配置为永远不提供此文件!)

我认为这样做也应该解决您似乎拥有的连接池问题。

于 2012-10-29T07:35:51.207 回答