欢迎光临
我们一直在努力

使用显式凭据访问 SQL Server-.NET教程,Web Service开发

建站超值云服务器,限时71元/月

连接到 sql server 的可靠方法是在连接字符串中传递用户名和密码。您可以以不同的方式使用此策略:

  • 提示用户输入用户名和密码。
  • 使用预设的用户名和密码。

    安全说明   使用连接字符串访问 sql server 不如使用集成安全性安全。仅当在您的应用程序中使用集成安全性不可行时,才与显式凭据一起使用连接字符串。

提示输入凭据

您可以提示用户输入用户名和密码(例如,使用 forms 身份验证),然后在连接字符串中将凭据传递到 sql server。提示输入凭据具有几个缺点。它要求 sql server 分别识别每个用户。而且,它对于连接池也是低效的,因此会限制可伸缩性。有关 forms 身份验证的示例,请参见asp”>简单 forms 身份验证。

安全说明   在应用程序中提示用户输入用户名和密码是一种潜在的安全威胁。凭据信息必须从浏览器传输到服务器上,而普通的 http 传输未加密。为了获得最佳安全性,在应用程序中提示用户提供凭据时,应使用安全套接字层 (ssl),它在将信息从浏览器发送到服务器之前,对其进行加密。有关如何实现 ssl 的详细信息,请参见 microsoft 知识库文章 q307267how to:windows 2000 中带有安全套接字层的安全 xml web services。

在连接字符串中动态地传递显式用户名

  • 在获取用户的名称和密码之后,以代码形式将它们串联到连接字符串中,然后将它们分配给连接对象的 asp”>connectionstring 属性。

    安全说明   您应该确保用户名和密码不包含恶意内容。以下示例说明做到这一点的一种方法。有关更多信息,请参见asp”>脚本利用。

    以下示例显示如何动态地创建连接字符串。假定用户名和密码在文本框中是可用的。用一个函数筛选用户输入,以确保它仅包含预设的字符。

    提示   如果您熟悉正则表达式的使用,则可以创建此筛选器的更高效版本。有关详细信息,请参见asp”>正则表达式类。

     visual basic
        private function validateinput(byval validchars as string, _
        byval userinput as string) as boolean
        dim c as char
        for each c in userinput
        if validchars.indexof(c) < 0 then
        return false
        end if
        next
        return true
        end function
        private sub opendatabase()
        dim vchars as string = _
        "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz*&%$#!"
        dim userid as string
        dim password as string
        if validateinput(vchars, username.text) then
        userid = username.text
        else
        throw new system.exception("invalid user name.")
        end if
        if validateinput(vchars, passwordtext.text) then
        password = passwordtext.text
        else
        throw new system.exception("invalid password.")
        end if
        dim connectionstring as string
        connectionstring =  "data source=myserver"
        connectionstring &= ";initial catalog=northwind"
        connectionstring &= ";user id=" & userid
        connectionstring &= ";password=" & password
        sqlconnection1.connectionstring = connectionstring
        sqlconnection1.open()
         further code to work with the database
        end sub
        // c#
        private boolean validateinput(string validchars, string userinput)
        {
        foreach(char c in userinput)
        {
        if(validchars.indexof(c) < 0)
        {
        return false;
        }
        }
        return true;
        }
        private void opendatabase()
        {
        string vchars =
        "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz*&%$#!";
        string userid;
        string password;
        if(validateinput(vchars, username.text))
        {
        userid = username.text;
        }
        else
        {
        throw new system.exception("invalid user name.");
        }
        if(validateinput(vchars, passwordtext.text))
        {
        password = passwordtext.text;
        }
        else
        {
        throw new system.exception("invalid password.");
        }
        string connectionstring;
        connectionstring =  "data source=myserver";
        connectionstring += ";initial catalog=northwind";
        connectionstring += ";user id=" + userid;
        connectionstring += ";password=" + password;
        sqlconnection1.connectionstring = connectionstring;
        sqlconnection1.open();
        // further code to work with the database
        }

使用预设的凭据

如果没有提示您输入凭据,则可以使用预设的用户名和密码。推荐的方法是将预设的用户名和密码存储在服务器上,然后在运行时读取它并将它添加到连接字符串。此技术的优点是:您的应用程序可以根据它需要在数据库中执行的操作,在不同情况下使用不同的凭据访问数据库。

安全说明   决不将凭据以字符串形式硬编码到您应用程序的程序中。能够访问代码文件(甚至是已编译的代码)的任何人员,都将能够获取凭据。

安全说明   始终将资源的最少访问特权给予预设用户名。决不使用“sa”或任何其他管理级别的用户名。始终使用密码。

您可以将凭据存储在各种不同的位置。两个选项是:

  • 在 web.config 文件中。这使与应用程序一起部署配置信息变得很容易。虽然配置文件与 asp.net 应用程序存储在同一目录中,但是 asp.net 可以防止客户端直接访问扩展名为 .config 的文件。为了获得额外的安全性,您可以设置配置文件的 ntfs 文件系统权限并对该文件内的连接字符串进行加密。
  • 在 windows 注册表中,作为自定义子项。凭据没有存储在可通过 web 访问的目录中,这样可以降低字符串的潜在可视性。但是,此方法使部署更复杂,因为安装应用程序要求更改目标计算机的注册表。为了获得额外的安全性,您可以使用访问控制列表 (acl) 限制对注册表子项的访问并对子项内的连接字符串进行加密。

    注意   有关存储数据库凭据的进一步信息,请参见asp”>数据库安全性。

如果您确实将凭据作为应用程序的一部分进行存储,则应该尝试通过加密来保护它们。一种可能性是使用“数据保护 api”(dpapi)。有关详细信息,请参见 msdn 技术文章“windows 数据保护”。

在 web.config 中存储凭据

  1. 在 web.config 文件中,在 <appsettings> 元素中创建一个新的 <add> 关键字。<appsettings> 元素必须作为 <configuration> 元素的子元素出现。有关详细信息,请参见asp”>配置节架构。

    以下示例说明包含标记为“mappedname”和“mappedkey”的用户名和密码的 <add> 关键字。

    提示   在应用程序中最好不使用字符串“password”和“user name”(或“username”),这样,搜索这些词的恶意用户就找不到它们。

    <appsettings>
        <add key="mappedname" value="mywebappuser"/>
        <add key="mappedkey" value="aje$31"/>
        </appsettings>
  2. 在您的应用程序中,从 asp”>system.configuration.configurationsettings 类的静态 asp”>appsettings 属性读取凭据。

    以下示例显示如何在运行时读取凭据并将它们串联到连接字符串中:

     visual basic
        dim connectionstring as string
        dim user as string = system.configuration.configurationsettings. _
        appsettings("mappedname")
        dim pass as string = system.configuration.configurationsettings. _
        appsettings("mappedkey")
        connectionstring =  "data source=myserver;initial catalog=northwind"
        connectionstring &= ";user id=" & user
        connectionstring &= ";password=" & pass
        sqlconnection1.connectionstring = connectionstring
        // c#
        string connectionstring;
        string user = system.configuration.configurationsettings.
        appsettings["mappedname"];
        string pass = system.configuration.configurationsettings.
        appsettings["mappedkey"];
        connectionstring =  "data source=myserver;initial catalog=northwind";
        connectionstring += ";user id=" + user;
        connectionstring += ";password=" + pass;
        sqlconnection1.connectionstring = connectionstring;

在注册表中存储凭据

  1. 向 hkey_local_machine 配置单元的 software 项中添加新的子项。
  2. 在您的应用程序中,使用 asp”>registry.localmachine 对象的 asp”>opensubkey 方法访问子项。

    注意   为了使用 registry 类,您必须导入 system 和 microsoft.win32 命名空间。

    以下示例说明如何从子项“connection”中获取用户名和密码(作为名为“mappedname”和“mappedkey”的字符串值存储):

     visual basic
        dim user, pass, connectionstring as string
        user = microsoft.win32.registry.localmachine.opensubkey( _
        "software\connection").getvalue("mappedname").tostring()
        pass = microsoft.win32.registry.localmachine.opensubkey( _
        "software\connection").getvalue("mappedkey").tostring()
        connectionstring = "data source=myserver;initial catalog=northwind"
        connectionstring &= ";user id=" & user
        connectionstring &= ";password=" & pass
        sqlconnection1.connectionstring = connectionstring
        // c#
        string user, pass, connectionstring;
        user = microsoft.win32.registry.localmachine.
        opensubkey("software\\connection").
        getvalue("mappedname").tostring();
        pass = microsoft.win32.registry.localmachine.
        opensubkey("software\\connection").
        getvalue("mappedkey").tostring();
        connectionstring = "data source=myserver;initial catalog=northwind";
        connectionstring += ";user id=" + user;
        connectionstring += ";password=" + pass;
        sqlconnection1.connectionstring = connectionstring;
赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 使用显式凭据访问 SQL Server-.NET教程,Web Service开发
分享到: 更多 (0)