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

Posted

技术标签:

【中文标题】使用集成安全连接到 PostgreSQL 或回退到公共登录【英文标题】:Connect to PostgreSQL using integrated security or fall back to public login 【发布时间】:2012-10-29 04:46:54 【问题描述】:

我正在使用 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 连接并查询是否存在合适的集成安全角色并重新连接,但这似乎比上述更麻烦。

【问题讨论】:

【参考方案1】:

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

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

hostname:port:database:username:password

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

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

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

【讨论】:

我不使用集成安全性的密码,因为它是自动处理的(这是集成安全性的全部目的)。我在上面的代码中省略了密码,因为它不相关,上面只是为了或多或少地演示我在做什么。无论如何,问题不在于登录,问题在于我想自动回退到非集成安全而不必捕获异常或导致 PostgreSQL 将其记录为致命错误。跨度> 啊,对不起,我误解了你的问题。但是,嘿,如果你想要实用的解决方案,我的食谱应该可以工作! :-) 这个关于身份验证的重要日志对您来说是一个大问题吗? Npgsql 每次仅使用一种身份验证方法进行连接。当另一个身份验证类型失败时,它没有任何选项可以自动尝试其他身份验证类型。我认为处理您的问题的最佳方法是像您一样:尝试第一次 Windows 身份验证,如果失败,请尝试用户名密码。 .pgpass 方法的唯一问题是 Npgsql 不是基于 libpq。 Npgsql 在 TCP 之上有自己的 Postgresql 协议实现,因此基于 Npgsql 的程序不会使用此配置。

以上是关于使用集成安全连接到 PostgreSQL 或回退到公共登录的主要内容,如果未能解决你的问题,请参考以下文章

Git 回退到某个节点

git回退到某个版本后发现最近提交的都不见了(解决方法)

如果需要,如何编写调用 WCF 服务并从 Kerberos 回退到 NTLM 的代码?

从每个组中选择1行匹配或回退

git 删除分支和回退到以前某个提交版本

PHP PDO 连接到具有集成安全性的 SQL Server?