IIS7,SQL 2008和ASP.NET MVC安全性

17

我有一个ASP.NET MVC应用程序正在开发中。我一直在Windows Server 2003上使用IIS6和SQL 2008 Express进行开发,并且一切正常。最近我决定尝试一下Windows 7 beta版本,所以现在我正在使用IIS7,并遇到了连接数据库的问题,但似乎无法解决。

我可以正常运行/调试应用程序,但每当我尝试访问需要访问数据库的页面时,我会收到以下错误:

"Cannot open database "MyDatabaseName" requested by the login. The login failed. Login failed for user 'IIS APPPOOL\MyApplicationName'."

很明显,我的某些安全配置设置错误,但我似乎找不到任何关于如何正确设置它的好文档。我已经尝试在数据库上授予NETWORK SERVICE 权限,但这似乎不起作用。有人知道我需要做什么才能赋予"IIS APPPOOL\MyApplicationName"对此数据库的权限吗?我是否漏掉了一些明显的东西?

谢谢...

16个回答

31

如果您没有使用Active Directory,请忽略这里提到的所有其他解决方案。混淆源于IIS 7.5+中新的ApplicationPoolIdentity设置默认值(MS不断更改身份验证机制)。

  1. 打开SQL Management Studio,以管理员身份连接到本地计算机。
  2. 展开Security分支。
  3. 右键单击Logins,然后选择New Login
  4. Login Name字段中输入“IIS APPPOOL\MyApplicationName”。不要单击搜索按钮。用户配置文件实际上不存在于本地计算机上,而是按需动态创建的。

当您查看它时,不要忘记将用户添加到数据库或服务器角色中。


你把密码留空了吗? - Jack
创建一个“Windows登录”,不会要求密码。 - Eric Falsken
“不要点击搜索按钮” 对我来说是关键部分,我知道该做什么,但点击搜索按钮无法找到用户,我就卡在那儿了。 - Matma
当你的SQL Server在不同于IIS的机器上时,这种方法无法工作。 - rboarman
正确。如果不是在活动目录中,那么您必须在托管 SQL 的服务器上创建用户帐户。如果使用 SQL 身份验证,则可以创建简单的 SQL 帐户。否则,您可以使用具有相同用户名和密码的 Windows 帐户作为网站正在运行的用户帐户,但是网站必须作为具有“登录为服务”的权限的用户运行。 - Eric Falsken

6
这个错误意味着 Web 应用程序无法访问您的数据库。在 Windows 7 / IIS 7 上,默认情况下,每个应用程序池都有自己的用户。似乎这样做是为了通过限制 Web 应用程序可以执行的操作(以防它被外部控制和攻击)来提高安全性。您可以更改应用程序池正在运行的用户,但这会破坏其本身的目的。更好的方法似乎是给池的用户所需的权限(而不是多余的权限)。在 SQL Management Studio 中连接到要让您的 Web 应用程序连接的服务器(使用 SQL Server 2008 进行测试)。转到:
Security -> Log ins

右键点击,新建登录。在弹出的表单中,除了用户名(username)需要输入Web应用程序尝试使用的任何用户名(例如“IIS APPPOOL\MyApplicationName”)之外,其他所有内容都保持默认设置。请注意,该对话框的搜索功能无法找到或检查该用户是否有效,但仍然可以正常工作。

仍然连接到服务器的SQL管理工具,请转到

Databases -> *YOUR-DATABASE* -> Security -> Users

右键点击并选择“新建用户”。我不确定那里的用户名字段是否有任何影响,我只是将其设置为用户名的最后一部分,例如“MyApplicationName”。然后,我将登录名设置为“IIS APPPOOL\MyApplicationName”。您可以单击“...”按钮并使用检查和搜索,这次它会工作。如果您不执行上一步,则该用户将不会出现在此处。然后,按照您想要赋予此用户的权限进行设置,例如“db_datareader”。

就是这样,您已经授予权限了。如果缺少权限是您的问题,那么它应该已经解决了(或者至少,我是通过这种方式解决的)。

我在使用IIS方面有2小时的经验,在SQL Server方面有约三周的经验,以及在微软技术方面不足两个月的经验,因此请谨慎采纳我的建议,我可能完全错了。(如果另一个人可以确认这些是正确的步骤,请随意删除最后的警告)。


2

Erick Falsken是正确的,但他漏掉了用户映射。因此,请右键单击新的IIS APPPOOL/DefaultAppPool,在属性中勾选以下复选框: 1) 数据库master和你的数据库 2) db_owner和public


2
这里有一篇文章解释了为什么要使用AppPoolIdentities,基本上是为了增强安全性:http://learn.iis.net/page.aspx/624/application-pool-identities/ 该文章声称我可以像使用任何常规帐户一样使用这些虚拟帐户,但在我的Windows Server 2008上似乎不可能;例如添加IIS AppPool\DefaultAppPool只会产生错误:“以下对象不来自选择位置对话框中列出的域,因此无效。”

1

这个错误通常意味着您的网站运行的用户(或者更准确地说是应用程序池)没有使用数据库的权限。您可以在 IIS 中检查池正在哪个用户下运行,并给他们授权,或者改变您的 SQL 连接字符串,不使用受信任的身份验证,而是在连接字符串中提供具有权限的用户的凭据。

编辑: 如果您右键单击池标识部分并转到属性,它应该会出现一个框,让您选择 3 个内置系统帐户之一,或指定自己的帐户。要么为其中一个内置帐户授予 DB 权限,要么使用具有权限的帐户。或者保持原样并更改您的连接字符串。


1

嗯...将ApplicationPoolIdentity属性更改并将其设置为NETWORK SERVICE似乎已经解决了我的问题。不确定这是否是“正确”的做法(也就是说,我不确定这是否是在IIS7中推荐的做法),但至少它似乎正在工作,并且已经让我暂时摆脱了这个障碍。谢谢。


如果我的答案解决了您的问题,您可以给一些声望并且可能接受这个答案吗? - Sam Cogan
1
我真的试图在表达这一点时保持建设性:但我已经看到这些类型的安全更改导致黑客攻击的安全漏洞。仅仅因为花费了数小时来搞定安全设置最终得出了一种能使应用程序工作的配置,这并不代表它是安全的。 - Matt Kocaj
1
似乎你已经给应用程序池授予了不适当的访问权限。 - Matt Kocaj

1

我熟悉将权限授予应用程序正在运行的用户的想法...我的问题是,在IIS7中,“用户”似乎是虚拟的或类似于奇怪的东西。在我将“应用程序池属性”的“Identity”属性更改为NETWORK SERVICE之前,它设置为“ApplicationPoolIdentity”,我遇到的错误是“IIS APPPOOL\MyApplicationName”无法访问数据库。当我尝试将“IIS APPPOOL\MyApplicationName”用户添加到数据库时,它似乎不存在...至少我找不到。

因此,我的最终问题是不理解或找不到任何关于IIS7安全模型如何工作的好文档。当我创建应用程序时,它似乎为此应用程序创建了一个具有相同名称的AppPool。考虑到AppPool运行的用户似乎实际上不存在,我不知道需要进行哪些更改才能赋予应用程序和/或其运行的用户对数据库的特权。

正如我所提到的,将AppPool的Identity更改为NETWORK SERVICE现在似乎已经起作用,但我正在尝试找出在IIS7下这种情况的最佳做法。谢谢。


1

把难题留给别人 -

创建一个 SQL 用户并使用 SQL Auth。:D


那确实是最简单的方式,你有必须使用可信身份验证的特殊原因吗? - Sam Cogan
我明白,但我并不是想走最简单的路线...我想学习/理解IIS7安全模型。我想了解如何正确地使可信安全性起作用。 - Bob Yexley
请发布您的连接字符串。 - Matt Kocaj
这是最简单的方法;另一方面,它可能会带来安全问题,并且可能违反公司政策。 - JosephDoggie

1

如果你遵循Fernández先生的建议,你将使一切正常运作。这是给网站最小权限的新方法。

所以不要做容易但不安全的事情(NETWORK SERVICE)。做正确的事情。向上滚动。;)


我的浏览器在这个页面中找不到Fernández或Fernandez,所以我不知道“正确的事情”是什么,除非我假设它不是正确的事情。 - Sam Hobbs

1

在Windows身份验证模式下使用受信任的连接: 操作系统:Windows 7 32位 IIS 7,Sql Server 2008 R2 Express 连接字符串: cn.open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=test;Data Source=mycomputername\sqlexpress;"(如果实例名称为sqlexpress或您使用的任何实例名称)

如果您无法使用Windows模式身份验证连接到SQL Server 2008,请尝试以下方法。

NT AUTHORITY\IUSR帐户可能没有在SQL Server中授权连接数据库的权限。

请使用Windows身份验证模式连接SQL Server。 展开“安全性”节点。 选择NT AUTHORITY\IUSR(如果不存在,则添加新的登录名) 在登录属性窗口下选择“用户映射”。 选择您要连接的数据库。 从“Database role membership for:......”中选择以下权限 1. db_datareader '这允许打开连接 2. db_datawriter '这允许从数据表中获取数据记录


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接