1

我正在使用Npgsql,我想知道是否有一种方法可以使用集成安全性连接到PostgreSQL服务器,并自动回退到公共登录?或者,也许还有另一种方式去做我想要达到的目标。使用集成安全性连接到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读”的作用时间,它增加了一个关键的日志条目说,有是一个认证错误。我能看到的唯一方法是通过www-read连接并查询是否存在适当的集成安全角色并重新连接,但这似乎比上述更为麻烦。

回答

1

我在代码中看不到任何密码。你有没有使用任何安全性?

hostname:port:database:username:password 

如果您不想嵌入密码进入你的源代码(这是正确的),你应该在其中有1个或多个行这样你的home目录(%appdata%/postgresql/pgpass.conf在Windows上)创建~/.pgpass文件

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

如果这点会在www数据用户的身份运行,.pgpass应当在其主目录中创建(但一定要配置Web服务器不能永远服务于这个文件!)

我觉得这样做也应该修复您似乎拥有的连接池问题。

+0

我不使用密码进行集成安全性,因为它是自动处理的(这是集成安全性的全部目的)。我在上面的代码中省略了密码,因为它不相关,上面只是为了展示我正在做什么。无论如何,问题不在于登录,问题是我希望自动回退到非集成安全性*,而不必捕捉异常或导致PostgreSQL将其记录为致命错误。 – dreamlax

+0

啊,对不起,我误解了你的问题。但是,嘿,我的食谱应该工作,如果你想要实际的解决方案! :-) – mvp

+0

是的,这是有用的信息,但:) :) – dreamlax