﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Welcome to 陈俊峰's ---BeetleHeaded Man Blog !-随笔分类-WEB Service</title><link>http://www.cppblog.com/Jeff-Chen/category/1692.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 24 May 2008 17:00:35 GMT</lastBuildDate><pubDate>Sat, 24 May 2008 17:00:35 GMT</pubDate><ttl>60</ttl><item><title>IIS、ASP.NET和SQLServer的安全性问题 </title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/6993.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Fri, 12 May 2006 03:28:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/6993.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6993.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/6993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6993.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6993.html</trackback:ping><description><![CDATA[
		<img height="1" src="http://www.pcbookcn.com/images/ads_200.gif" width="1" align="left" />
		<span class="main">SQL Server、Internet 信息服务器和 ASP.NET 引擎都提供了坚实可靠的安全模型，它们可以很好地在一起协同工作。为了保证用户数据和应用程序的安全，Microsoft 还为每项服务的默认设置设置了相当低的值。大多数开发人员面临的挑战是如何使用 SQL Server、IIS 和 ASP.NET 在应用程序和数据之间设置适当的信任级别，而不会留下可被别人轻易攻入的安全漏洞。由于涉及三类服务（SQL Server、IIS 和 ASP.NET），所以需要采取三个关键的步骤来确保解决方案的安全。本部分讨论一种为 Web 应用程序设置足够权限和信任级别的更常用（且可靠）的方法。 <br /><br /><a name="1"><b>定义 DotNetKB 自定义 IIS 用户帐户</b></a><br /><br />保证 Web 应用程序安全性的最安全的方法是定义一个权限有限的自定义用户，然后对 IIS 进行配置，使之能够在执行您的 Web 应用程序时能作为自定义用户运行。这是相当容易实现的，可以确保访问您的 Web 应用程序的每个访问者都只具有您希望他们具有的权限。 <br /><br />第一步是生成一个新的 Windows 用户（本例中称为 DotNetKB），为其设置一个增强型密码，然后将其添加到 Windows 来宾组 (Guest Windows Group) 中。同时，确保选中 Password never expires（密码永不过期）和 User cannot change password（用户不能更改密码）复选框。这样将生成一个权限有限的用户，在 IIS 中运行您的 Web 应用程序时，您可以将其用作标识（参见图 7）。 <br /><br /><center><img src="http://www.pcbookcn.com/img_article/2005131113612734.gif" /><br /><br />图 7：生成的权限有限的用户</center><br /><br />然后，调用 Internet 信息服务器管理员并选择承载这些网页的 Web 应用程序。在本例中，您可以选择承载前文所生成的测试页的 Web 应用程序 (DotNetKB_WebSite)。在树视图中的 Web 应用程序上单击鼠标右键，然后从上下文相关菜单中选择 Properties...（属性...）。然后选择 Directory Security（目录安全性）并单击该对话框 Anonymous access and authentication control（匿名访问和验证控制）部分中的 Edit（编辑）按钮。最后，输入自定义用户名 (DotNetKB)，取消选择 Allow IIS to control password（允许 IIS 控制密码）复选框，并输入该自定义用户帐户的密码。完成所有这些工作之后，单击 OK（确定）按钮，将这些更改保存到 IIS 配置数据库中（参见图 8）。 <br /><br /><center><img src="http://www.pcbookcn.com/img_article/2005131113613580.gif" /><br /><br />图 8：Authentication Methods（验证方法）对话框</center><br /><br />此时，IIS 将在一个权限有限的自定义帐户下运行。任何访问者访问您应用程序的网页时，都将以这个自定义用户身份运行，且只具有该自定义用户的验证权限。 <br /><br /><a name="2"><b>授权 DotNetKB 用户帐户访问 SQL Server</b></a><br /><br />然后，您需要为该自定义用户授予访问数据库 (DotNetKB) 的相应权限。为此，您可以使用 Microsoft SQL Server 企业管理器或编写一个自定义脚本，以创建一个这样的用户并授予其访问特定对象的权限。本文介绍如何使用 SQL Server 企业管理器完成此操作。 <br /><br /><b>注意：</b>尽管 Visual Studio .NET 2003 具有与 SQL Server 兼容的许多强大的集成功能，但也不允许从 Visual Studio .NET 2003 中轻松管理用户和用户权限。在大型的组织和团队中，这些高级任务通常由数据库管理员完成。 <br /><br />因此，启动 SQL Server 企业管理器之后，您可以按照以下步骤将自定义用户 (DotNetKB) 添加数据库中（参见图 9）： <br /><br />·在左侧的树视图中，展开节点以显示 DotNetKB 数据库。在我的计算机上，树视图的结构如下：Console Root | SQL Server Group | (LOCAL) (Windows NT) | Databases | DotNetKB。<br />·然后，在数据库下的 Users（用户）节点上单击鼠标右键，并选择 New Database User...（新建数据库用户...）。显示 Database User Properties - New User（数据库用户属性 - 新建用户）对话框时，从 Login name（登录名）下拉框中选择 <new>（&lt;新建&gt;）。<br />·显示 SQL Server Login Properties - New Login（SQL Server 登录属性 - 新建登录）对话框时，选择 General（常规）选项卡，并在 Name（名称）输入框中输入 DotNetKB。确保选中 Windows Authentication（Windows 验证）单选按钮，并从 Domain（域）下拉框中选择自定义用户帐户所在的计算机的名称。然后从 Database（数据库）下拉框中选择 DotNetKB。<br />·现在，选择 Databases（数据库）选项卡，在对话框顶部的列表中找到 DotNetKB 数据库并选中它。然后，确保选中对话框底部列表中的 public（公共）角色。最后，单击对话框底部的 OK（确定）按钮，保存您的更改。 <br /><br /><center><img src="http://www.pcbookcn.com/img_article/2005131113613621.gif" /><br /><br />图 9：在数据库中添加自定义用户 </center><br /><br />然后，您需要为 DotNetKB 数据库中的所有存储过程和自定义函数添加执行权限。为此，您只需为 public（公共）角色授予权限。您可以将权限授予 DotNetKB 用户，这样将使以后的登录（当这些用户获得访问 DotNetKB 的权限时）更容易执行存储过程，而不需要为每个用户添加新的权限。 <br /><br />下面是为 DotNetKB 数据库中的存储过程和函数授予执行权限的步骤： <br /><br />·突出显示树视图中 DotNetKB 数据库下的 Users（用户）节点，以显示此数据库的用户列表。找到 DotNetKB 用户并在其上双击，打开 Database Users Properties（数据库用户属性）对话框。<br />·突出显示（选中）public（公共）角色时，单击 Properties...（属性...）按钮，打开 Database Role Properties（数据库角色属性）对话框。然后单击 Permissions...（权限...）按钮，显示数据库对象和权限设置列表。<br />·选中对话框顶部 Database role（数据库角色）下拉列表中的 public（公共）角色之后，找到为此数据库定义的所有存储过程和自定义函数（可能需要展开对话框才能看到全名），并确保选中各项旁边的 EXECUTE（执行）复选框。您可能会发现某些系统对象的其他一些复选框也被选中了，请不要更改这些选项。<br />·最后，设置所有的 EXECUTE（执行）权限后，单击 OK（确定）按钮，保存更改并关闭对话框。依次单击 OK（确定）按钮，直到所有对话框均被关闭。 <br /><br />至此，您已为 IIS 创建了自定义用户，并设置了该用户在 SQL Server 中的相应权限。现在，您需要在 ASP.NET Web 项目中进行一个配置更改，确保 ASP.NET 使用同一个用户帐户执行对 SQL Server 的所有调用。 <br /><br /><a name="3"><b>设置您的 ASP.NET 应用程序以模拟 DotNetKB 用户</b></a><br /><br />为 IIS 下运行的 ASP.NET Web 应用程序生成坚实可靠的配置的最后一个步骤是：配置 ASP.NET Web 应用程序，使之能够接受来自 IIS 的 Windows 用户标识并能用于访问其他操作系统资源。为此，您只需在 web.config 根文件中输入一行代码。 <br /><br />修改后的 web.config 文件如下所示： <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"><pre><ccid_code>&lt;configuration&gt;
  &lt;system.web&gt;
    ... 其他要素 ...
    &lt;identity impersonate="true"/&gt; &lt;!-- 假设 IIS 用户标识 --&gt;
    ... 其他要素 ...
  &lt;/system.web&gt;
&lt;/configuration&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />请注意，您只需添加 <identity>元素并将模拟特性设置为 true（真）。不必输入用户帐户或密码，因为这些信息将由 IIS 提供。也就是说，即使其他人能够读取您的配置文件，他们也无法确定使用哪些标识凭据来执行您的 Web 应用程序。 <br /><br />至此，您已生成了自定义用户，并为其设置了访问 SQL Server 和 IIS 的相应权限。在下一篇《创建 ASP.NET 测试页》中，我们来创建一些测试页，确保它能够正常工作。从这里您可以看出一切正常。<img height="1" src="http://www.pcbookcn.com/down_info.asp?id=2390" width="1" border="0" /></identity></new></span>
		<br />
		<br />
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-12 11:28 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/6993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>