积极答复者
web数据库连接如何使用客户端用户的域帐号

问题
-
基本配置,Win 2003 Server的一个IIS6.0的网站,使用域认证。一个SQL2005数据库,只有申请过权限的帐号才能只读连接它(公司policy规定)。
我现在想写一个web界面给它,数据库连接字使用:
<add name="BigFixConnection" connectionString="Data Source=BFEServer;Initial Catalog=BFEnterprise;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient" />
网页相关代码为:
Default.aspx:
<div>
User: <asp:Label ID="LogOnUserLabel" runat="server" />
<br />
Status: <asp:Label ID="DBCStatusLabel" runat="server" />
</div>
Default.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
LogOnUserLabel.Text = User.Identity.Name;
TestConnection();
}
}
private void TestConnection()
{
try
{
using (DbConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["BigFixConnection"].ConnectionString))
{
conn.Open();
conn.Close();
this.DBCStatusLabel.Text = "BigFix Database connection test ok<br/>";
}
}
catch (Exception exp)
{
this.BodyPlaceHolder.Visible = false;
this.DBCStatusLabel.Text = "BigFix Database connection error: " + exp.Message + "<br/>";
}
}
出来的结果是:
User: FAREAST\t-wishc
Status: BigFix Database connection error: Login failed for user 'FAREAST\scsshtest99$'.
FAREAST\scsshtest99是机器名,就是网站所在的server,我希望使用 FAREAST\t-wishc。
有什么办法实现用客户端用户的域帐户连接web数据库?谢谢帮助。
补充,我对那个数据库只有只读权限,也不知道哪些人是申请过只读权限的,做webUI是为了一站式服务,方便大家。而用客户端的域帐户来连接是为了不违反公司权限申请的policy。
答案
-
楼主,
你的数据库是否已经添加了客户端的域用户,如果没有即使你使用了上述配置还是不行的。
首先数据库必须添加该域用户并给予相关权限。
其次 数据库已经设置成允许远程访问了。就是TCP/IP设置的问题。
其次如果服务器端有防火墙,需要添加例外端口,一般可能是1433,你可以使用sql server 配置工具查看。
最后按照西红柿和韦恩的方法配置,再试试。
Microsoft Online Community Support- 已标记为答案 KeFang Chen 2009年5月22日 8:07
全部回复
-
你好
因为你只有数据库的度权限,因此你可以考虑模拟impersonate。详情可以参考下面两篇文章。
http://www.cnblogs.com/geraint999/articles/1335940.html
http://technet.microsoft.com/zh-cn/library/cc781369.aspx
Microsoft Online Community Support -
谢谢你们的帮助,我使用了模拟和委托的方法。模拟只能模拟当前用户在本机,要访问远端数据库得用委托,但是委托似乎只能委托特定用户。
总结下来就是:
- 在
machine.config中指定
<processModel userName="machine">就会委托ASPNET 本地用户帐户 。
这个帐号对数据库没有权限,被远端数据库当作NT AUTHORITY\ANONYMOUS LOGON - 在
machine.config中指定
<processModel userName="System">就会委托用于运行 IIS 的帐户。
这个帐号对数据库没有权限,被远端数据库当作NT AUTHORITY\ANONYMOUS LOGON - 在
machine.config中指定
<processModel> 将某个具体帐户用作进程标识时,ASP.NET 尝试委托该帐户。
这种方法可以登上远端数据库,但不是我要的当前用户。实现上还不如来个APP Pool来的方便安全。
- 在
-
IIS里面匿名模式就没有打开过,一开始就是用的Windows身份验证。在打开模拟后,他确实用了当前用户的身份,但只是用它访问本地资源。我现在是想用这个身份访问网络。
关于同一个域的问题,我试着连接了一个本域的数据库。
<add name="BigFixConnection" connectionString="Data Source=【本域机器】;Initial Catalog=【XXX】;Integrated Security=SSPI;"
providerName="System.Data.SqlClient" />
结果还是
Status: BigFix Database connection error: Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
我又试着换成连接网站服务器本机的数据库。
<add name="BigFixConnection" connectionString="Data Source=localhost;Initial Catalog=【XXX】;Integrated Security=SSPI;"
providerName="System.Data.SqlClient" />
结果成功。
Status: BigFix Database connection test ok
所以问题就是在委托上面了。达人们帮帮忙吧。
-
楼主,
你的数据库是否已经添加了客户端的域用户,如果没有即使你使用了上述配置还是不行的。
首先数据库必须添加该域用户并给予相关权限。
其次 数据库已经设置成允许远程访问了。就是TCP/IP设置的问题。
其次如果服务器端有防火墙,需要添加例外端口,一般可能是1433,你可以使用sql server 配置工具查看。
最后按照西红柿和韦恩的方法配置,再试试。
Microsoft Online Community Support- 已标记为答案 KeFang Chen 2009年5月22日 8:07
-
西红柿你好,
你好
我的理解是:
楼主想通过域用户来访问数据库。当用户输入域用户名和密码后,因为楼主设置的是Integrated Security=True,所以SQL使用当前的Windows 帐户凭据进行身份验证后登录数据库。
所以我认为如果数据库中没有添加该域用户,那么是登录不了的。
如果有不当之处,请指正,谢谢。
Microsoft Online Community Support我原来也遇到过这个问题,就算在数据库中添加域帐户也不一定能够访问,还要server开一个端口,就在管理工具就可以配置,Integrated Security=True应该来说在应用程序配置上是没问题的,就像你说的,其实这里就是几个问题。1.链接字串2.数据库权限3.端口权限(如果默认开了就不管了)这就要看具体的环境了,因为我记得默认同域是可以的,:)再次感谢指教。
低调,低调 -
谢谢大家。不过我觉得可能是我表述不清。我再讲讲吧。
1. 那个数据库我如果使用我的帐户去run一个app pool,不要模拟委托,或者我写一个console程序,是可以连接成功的。所以我想数据库的帐号端口都没有问题。(有问题我也没有权限去改)
2. 我并不是希望每个域用户连接数据库都能够成功,只是希望那些在数据库中被添加了的域用户能够成功访问。
3. 公司里面查看这个数据库,需要用户拿自己的域帐号去申请,审批通过才行。所以我希望那些访问我的网站的人也要先去申请同样的权限,然后就能通过我的网站间接访问数据库。
我现在到底是个什么问题呢?
就是:
我用network service run 一个app pool, 网站是采用windows认证,开启模拟。当用户(Domain/A)访问我这个网站的时候,确实是要自动填写域用户名和密码。在ASP.net页面的上下文中,确实是使用了Domain/A在运行。这一点我查看过。
而在测试中,如果我访问的是网站本机的sql server。它也会使用Domain/A去访问。如果Domain/A有权限就显示OK,否则就是Login failed for user: 'Domain/A'。这和我想要的一模一样。
但是现在我访问的是一台远程的sql server。我就发现无论我用什么Domain/A去访问,都是一句Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'。
我查了一下资料,它说模拟只能够访问本机资源,要访问网络得用委托。如果委托失败,访问远程sql的帐号就是NT AUTHORITY\ANONYMOUS LOGON。我认为这就是问题所在。
关于委托,我也查了一些资料。最终结果是,要求IIS 使用 Kerberos身份验证,NTLM不能委托。关于这个我查了一些文档,照着改,结果差点把机器down掉了。所以我希望大家帮帮忙。多谢多谢。
对了,有一个很重要的信息我忘了说了,那个远程sql server和我不是在一个域里面,不过都是一个公司的网络。Integrated Security=True的话会出来一个flag错误。所以我的连接字很早就改成Integrated Security=SSPI。这样console和使用我帐号的app pool下的网站就可以访问成功的。- 已编辑 Wish Chen 2009年5月23日 2:57