使用集成安全性连接到 PostgreSQL 或回退到公共登录

问题描述 投票:0回答: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 连接并查询是否存在合适的集成安全角色并重新连接,但这似乎比上面更麻烦。

postgresql windows-authentication npgsql sspi integrated-security
2个回答
0
投票

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

如果您不想将密码嵌入到源代码中(这是正确的),您应该在主目录(Windows 上为

~/.pgpass
)中创建
%appdata%/postgresql/pgpass.conf
文件,其中包含 1 行或多行,如下所示:

hostname:port:database:username:password

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

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

我认为这样做也应该可以解决您似乎遇到的连接池问题。


0
投票

Windows 上 Postgres 的集成安全性可以通过编辑 postgresql 数据目录中的 2 个文件来完成,但需要注意一些事项。

  1. pg_ident.conf
    将 A/D 登录映射到 postgres 用户名:
# MAPNAME   A/D LOGIN                 PG-USERNAME
#
MapForSSPI  Login@DOMAINNAME          www-read
MapForSSPI  OtherLogin@DOMAINNAME     or-whatever-pg-rolename

我不确定这里是否有比单独列出您将允许使用集成登录的所有用户(或服务帐户?)更好的选择。每个 A/D 登录名都必须映射到 Postgres 用户名。因此,这可能只适用于简短且严格控制的列表。

  1. pg_hba.conf
    然后允许您上面列出的 PG-USERNAME 使用集成安全性作为登录方法。将这些用户特定行放在任何用户
    all
    行之上。 (通常在 pg_hba.conf 中,您依赖用户
    all
    行来允许任何人使用其用户名和密码登录)。
#== lines for SSPI users above your catchall lines ==
# TYPE  DATABASE  USER      ADDRESS       METHOD
# IPv4 local connections for SSPI:
host    all       www-read  <yourIP4net>  sspi  map=MapForSSPI
host    all       www-read  <yourIP6net>  sspi  map=MapForSSPI

需要注意的是,这仅适用于 Windows 域中的计算机(大概是您工作中的正常情况),或者仅适用于本地主机。

更多详细信息:https://www.cafe-encounter.net/p2034/postgres-using-integrated-security-on-windows-on-localhost

© www.soinside.com 2019 - 2024. All rights reserved.