none
web数据库连接如何使用客户端用户的域帐号 RRS feed

  • 问题

  • 基本配置,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。
    2009年5月18日 4:02

答案

  • 楼主,

    你的数据库是否已经添加了客户端的域用户,如果没有即使你使用了上述配置还是不行的。

    首先数据库必须添加该域用户并给予相关权限。
    其次 数据库已经设置成允许远程访问了。就是TCP/IP设置的问题。
    其次如果服务器端有防火墙,需要添加例外端口,一般可能是1433,你可以使用sql server 配置工具查看。
    最后按照西红柿和韦恩的方法配置,再试试。


    Microsoft Online Community Support
    2009年5月21日 6:15

全部回复

  • 你好

    因为你只有数据库的度权限,因此你可以考虑模拟impersonate。详情可以参考下面两篇文章。

    http://www.cnblogs.com/geraint999/articles/1335940.html

    http://technet.microsoft.com/zh-cn/library/cc781369.aspx
    Microsoft Online Community Support
    2009年5月19日 2:52
  • 可以直接把你的web ui 站点设置为非匿名模式   windows 安全集成  这样访问站点的时候  就会要求winnt/domain 的用户密码

    这样就有用户的数据库访问上下文了


    有效回复过700 撒花
    2009年5月19日 4:09
  • 谢谢你们的帮助,我使用了模拟和委托的方法。模拟只能模拟当前用户在本机,要访问远端数据库得用委托,但是委托似乎只能委托特定用户。
    总结下来就是:
    • 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来的方便安全。
    这三种都不是我要的,有什么办法委托当前登录的用户在网络上呢?
    2009年5月19日 10:13
  • 可以直接在IIS里面设置匿名模式为否,这样就会使用windows身份验证的方式进行登陆,必须要同一个域,你可以尝试一下。
    低调,低调
    2009年5月20日 1:34
    版主
  • 可以直接把你的web ui 站点设置为非匿名模式   windows 安全集成  这样访问站点的时候  就会要求winnt/domain 的用户密码

    这样就有用户的数据库访问上下文了

    就是这么做哦
    有效回复过700 撒花
    2009年5月20日 5:41
  • 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

    所以问题就是在委托上面了。达人们帮帮忙吧。

    2009年5月20日 6:43
  • 楼主,

    你的数据库是否已经添加了客户端的域用户,如果没有即使你使用了上述配置还是不行的。

    首先数据库必须添加该域用户并给予相关权限。
    其次 数据库已经设置成允许远程访问了。就是TCP/IP设置的问题。
    其次如果服务器端有防火墙,需要添加例外端口,一般可能是1433,你可以使用sql server 配置工具查看。
    最后按照西红柿和韦恩的方法配置,再试试。


    Microsoft Online Community Support
    2009年5月21日 6:15
  • 数据库的话好像要打开一个端口并允许一个域用户账户能够通过该端口访问远程的SQL Server,好像是8083,具体的我也不记得了。。

    如果你正确的设置了匿名模式,你在打开网站的时候就会要求你使用Windows身份验证模式去登录,无论你是不是在域里面,第一次都会要求输入用户名和密码的,你说的windows身份验证是数据库的吧,我们说的是网站的匿名模式,不是数据库的!

    如果你网站设置了匿名模式,访问数据库就是个问题,找找那个端口,在server上允许此端口通信就可以了。

    低调,低调
    2009年5月21日 8:55
    版主
  • 西红柿你好,

    我的理解是:
    楼主想通过域用户来访问数据库。当用户输入域用户名和密码后,因为楼主设置的是
    Integrated Security=True,所以SQL使用当前的Windows  帐户凭据进行身份验证后登录数据库。
    所以我认为如果数据库中没有添加该域用户,那么是登录不了的。
    如果有不当之处,请指正,谢谢。

    Microsoft Online Community Support
    2009年5月21日 9:07
  • 理解很到位阿


    有效回复过700 撒花
    2009年5月22日 2:40
  • 西红柿你好,

    我的理解是:
    楼主想通过域用户来访问数据库。当用户输入域用户名和密码后,因为楼主设置的是
    Integrated Security=True,所以SQL使用当前的Windows  帐户凭据进行身份验证后登录数据库。
    所以我认为如果数据库中没有添加该域用户,那么是登录不了的。
    如果有不当之处,请指正,谢谢。

    Microsoft Online Community Support
    你好

    我原来也遇到过这个问题,就算在数据库中添加域帐户也不一定能够访问,还要server开一个端口,就在管理工具就可以配置,Integrated Security=True应该来说在应用程序配置上是没问题的,就像你说的,其实这里就是几个问题。

    1.链接字串
    2.数据库权限
    3.端口权限(如果默认开了就不管了)

    这就要看具体的环境了,因为我记得默认同域是可以的,:)再次感谢指教。

    低调,低调
    2009年5月22日 2:55
    版主
  • 谢谢大家。不过我觉得可能是我表述不清。我再讲讲吧。

    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下的网站就可以访问成功的。

    2009年5月23日 2:34
  • 我今天把windows认证方式改成基本认证(这种认证方式可以很方便地进行委托),结果直接就成功了。但是基本方式认证密码会以明文传输。所以还是。。。。
    2009年5月25日 1:47
  • 你说的远程服务器的sqlserver  
    1  要在同一个域内  用域用户  可以访问
    2 或者双方的机器彼此信任(vpn 同工作组 专用网络)   彼此都有同样的windows用户名和同样的密码

    以上两者我都亲自测试过

    紫柔版主的头像真叫萌得一个不行啊。。。。
    2009年5月25日 2:22