postgresql - 使用集成安全性连接到 PostgreSQL 或回退到公共(public)登录

标签 postgresql windows-authentication npgsql sspi integrated-security

我正在使用 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/

相关文章:

mysql - GIS:PostGIS/PostgreSQL vs. MySql vs. SQL Server?

sql - 在 Postgres 中,如何匹配多个 "tags"以获得最佳性能?

iis-7 - 使用 Windows 身份验证在 IIS 7.5 上为 ASHX 处理程序启用 PUT

.net - AD/表单认证

windows - 什么是不同类型的 Windows token ,它们有何不同?

Visual Studio 2015 中的向导中缺少 PostgreSQL 数据提供程序

.net - Npgsql 找不到带有 XML 参数的函数,而是寻找 TEXT

postgresql - 在多个后续插入中使用 INSERT ... RETURNING 的返回值

PostgreSQL GOTO like 关键字跳转到一个 block

c# - EF Core 3.0 替换 IMutableIndex.Npgsql() 方法