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

使用集成安全性连接到PostgreSQL或退回到公共登录,postgresql,windows-authentication,npgsql,sspi,integrated-security,Postgresql,Windows Authentication,Npgsql,Sspi,Integrated Security,我正在使用Npgsql,我想知道是否有一种方法可以使用集成安全性连接到PostgreSQL服务器,该安全性可以自动返回到公共登录?或者也许有另一种方法来实现我想要实现的目标 我有一个使用Windows身份验证的ASP.NET网站(IIS7.5),并且我已将PostgreSQL配置为允许通过SSPI进行访问,只要数据库中有一个具有正确名称的角色,这就可以正常工作。内联网上的每个人都可以查看该网站,但有些用户有一些其他人不应该具备的额外功能(或可以查看额外数据) 目前,我正在使用类似以下内容: Np

我正在使用Npgsql,我想知道是否有一种方法可以使用集成安全性连接到PostgreSQL服务器,该安全性可以自动返回到公共登录?或者也许有另一种方法来实现我想要实现的目标

我有一个使用Windows身份验证的ASP.NET网站(IIS7.5),并且我已将PostgreSQL配置为允许通过SSPI进行访问,只要数据库中有一个具有正确名称的角色,这就可以正常工作。内联网上的每个人都可以查看该网站,但有些用户有一些其他人不应该具备的额外功能(或可以查看额外数据)

目前,我正在使用类似以下内容:

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上),该文件包含一行或多行如下内容:

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

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


我认为这样做还可以解决连接池的问题

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