17

我有一个正在开发的 ASP.NET MVC 应用程序。我一直在使用 IIS6 和 SQL 2008 Express 在 Windows Server 2003 上开发它,一切都运行良好。我最近决定试用 Windows 7 测试版,所以现在我使用的是 IIS7,但在连接到我的数据库时遇到了我似乎无法弄清楚的问题。

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

“无法打开登录请求的数据库“MyDatabaseName”。登录失败。用户“IIS APPPOOL\MyApplicationName”登录失败。”

我显然有一些安全配置设置不正确,但我似乎找不到任何关于如何正确设置的好的文档。我已经尝试在数据库上授予 NETWORK SERVICE 权限,但这似乎不起作用。任何人都知道我需要做些什么来给这个数据库“IIS APPPOOL\MyApplicationName”权限?我错过了一些明显的东西吗?

谢谢...

4

16 回答 16

31

如果您不使用 Active Directory,请忽略此处提到的所有其他解决方案。混乱源于ApplicationPoolIdentityIIS 7.5+ 中的新设置默认值(MS 不断更改身份机制)

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

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

于 2009-10-19T16:17:08.303 回答
6

该错误意味着 Web 应用程序无权访问您的数据库。在 Windows 7 / IIS 7 上,默认情况下每个应用程序池都有自己的用户。似乎这个想法是通过限制 Web 应用程序可以做的事情来提高安全性(以防它被外部破坏和控制)。您可以更改应用程序池在哪个用户下运行,但这会破坏它自己的目的。一种更好的方法似乎是为池的用户提供所需的权限(而不是更多)。

在 SQL Management Studio 上,连接到您希望 Web 应用程序连接的服务器(使用 SQL Server 2008 测试)。去

Security -> Log ins

右键单击,新建登录。在出现的表单中,除了用户名之外的所有内容都保留为默认值,您必须在其中键入 Web 应用程序尝试使用的任何用户名,在本例中为“IIS APPPOOL\MyApplicationName”。请注意,该对话框的搜索功能无法找到或检查该用户是否有效,但它仍然有效。

仍然在连接到服务器的 SQL Management Studio 上转到

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

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

就是这样,你已经给予了许可。如果缺少权限是您的问题,那么它应该被解决(或者至少,我刚刚以这种方式解决了它)。

我在 IIS 方面总共有 2 小时的经验,在 SQL Server 方面有大约三周的经验,在 Microsoft 技术方面的经验还不到两个月,所以请接受我的建议,我可能完全错了。(如果其他人可以确认这些是正确的步骤,请随时删除最后的警告)。

于 2009-06-23T10:34:17.313 回答
2

这是一篇解释为什么要使用 AppPoolIdentities 的文章;基本上,它是关于增强安全性:http ://learn.iis.net/page.aspx/624/application-pool-identities/

(那篇文章声称我可以像使用任何常规帐户一样使用这些虚拟帐户,但在我的 Windows Server 2008 上这似乎是不可能的;添加例如 IIS AppPool\DefaultAppPool 只会产生错误:“以下对象不是来自列出的域在“选择位置”对话框中,因此无效。”)

于 2009-04-09T07:29:08.980 回答
2

Erick Falsken 是对的,但是他缺少用户映射。因此,右键单击新的 IIS APPPOOL/DefaultAppPool,单击属性,然后选中以下复选框:1) 数据库 master 和 yourdatabase 2) db_owner 和 public

于 2012-11-27T00:41:44.057 回答
1

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

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

于 2009-01-18T02:24:41.597 回答
1

好吧...更改 ApplicationPoolIdentity 属性并将其设置为 NETWORK SERVICE 似乎解决了我的问题。不确定这是否是“正确”的做事方式(例如,我不确定这是否是在 IIS7 中做事的推荐方式),但它似乎至少可以工作并且已经让我过去了这个挂断了。谢谢。

于 2009-01-18T04:51:08.947 回答
1

第一步是验证您的网站在哪个帐户下运行。创建一个简单的 aspx 页面:

<%@ Page Language="C#" %>
<% Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name); %>

如果您使用 Windows 身份验证,WindowsIdentity 帐户将需要在您的 SQL Server 中登录。在 Security -> Logins -> Login New 下,您需要添加 WindowsIdentity 显示的任何名称,并确保选择了 Windows 身份验证。

如果您碰巧将数据库移动到单独的计算机上,则必须创建域帐户并在 web.config 中使用模拟。谷歌<identity impersonate="true">了解更多信息。

于 2009-01-18T17:17:07.513 回答
1

我熟悉授予应用程序在其下运行的用户权限的想法......我的问题是在 IIS7 中,“用户”似乎是虚拟的或类似的奇怪东西。在我将应用程序池属性的“身份”属性更改为网络服务之前,它被设置为“应用程序池身份”,我得到的错误是“IIS APPPOOL\MyApplicationName”没有访问数据库的权限。当我尝试将“IIS APPPOOL\MyApplicationName”用户添加到数据库时,它似乎不存在......无论如何我都找不到。

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

正如我所提到的,将 AppPool 的 Identity 更改为 NETWORK SERVICE 目前似乎已经奏效,但我试图找出在 IIS7 下这种事情的最佳实践是什么。谢谢。

于 2009-01-18T20:26:00.643 回答
1

把难题留给别人——

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

于 2009-01-19T08:41:19.987 回答
1

如果你听从费尔南德斯先生的建议,一切都会顺利进行。这是赋予站点最小权限的新方法。

所以不要做简单的、不太安全的事情(网络服务)。做正确的事。向上滚动。;)

于 2009-10-02T03:04:13.613 回答
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 ;数据源=mycomputername\sqlexpress;" (如果实例名称是 sqlexpress 或您使用的任何实例名称)

如果您无法使用 Windows 模式身份验证连接到 sql server 2008 连接 sql server。

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

使用windows认证方式连接Sql server。展开安全节点。选择 NT AUTHORITY\IUSR(如果没有,则添加新的登录)在登录属性窗口的选择页面下单击“用户映射”。选择您尝试连接的数据库。从“数据库角色成员资格中选择以下权限:......” 1. db_datareader '这允许打开连接 2. db_datawriter '这允许从数据表中获取数据记录

于 2011-09-27T13:48:46.993 回答
0

如果您查看该字段的描述,它会指出在“网络服务”帐户下运行是推荐使用的帐户。不知道为什么在 Win7 中它默认为 ApplicationPoolIdentity 设置。

于 2009-01-31T23:28:05.090 回答
0

我有完全相同的问题。我正在运行 Windows 7 RC。当我尝试使用 .mdf 文件(位于 App_Data 中)时,现在有办法让这件事发挥作用。我确实尝试为 LocalSystem 更改 AppPool 的标识,但它根本不起作用。

如果我使用“标准”数据库,那么如果我使用 LocalSystem,它将可以工作,但它不适用于著名的 'IIS APPPOOL\DefaultAppPool'。

我发现没有找到任何关于这件事的信息有点令人不安,如果您使用任何类型的数据库,“IIS APPPOOL\DefaultAppPool”用户似乎完全没用......

正如 ryexley 所说,我正在运行它,但我也对不了解安全模型感到有点沮丧。

于 2009-05-25T18:02:51.570 回答
0

我在(安装在独立 Win-server2003 服务器上的 SQL2008)和(安装在独立 Win-server2003 服务器上的带有 ASP.NET3.5 的 IIS6)之间遇到了同样的问题。

其中,IIS 尝试使用域“域\用户名”中的某个用户访问 SQL2008。

我从连接字符串中删除了以下选项,现在一切正常。

Integrated Security=True;
于 2010-12-07T07:07:41.807 回答
0

是的,应用程序池标识方法不像他们说的那样工作(无论如何都不是在 IIS7 中)。我认为 MS 的黑客故意使这种安全性变得复杂,因此您选择阻力最小的路径并使您的系统不那么安全(因此他们以后可以入侵它)。- 开个玩笑,但实际上,他们的安全模型是纯粹的疯狂,在 MSDN 上的任何地方都没有直接(逐步)的说明 - nada,zip!

于 2012-06-14T02:52:48.753 回答
0
  1. 打开SQL Management Studio,以管理员身份连接到本地计算机。
  2. 展开安全分支。
  3. 右键单击登录并选择新登录
  4. 登录名字段中,输入“ IIS APPPOOL\MyApplicationName ”。不要点击搜索按钮。用户配置文件实际上并不存在于本地计算机上,它是按需动态创建的。
  5. 用户映射中选择数据库
  6. 服务器角色中选择sysadmin
于 2021-02-10T09:42:53.887 回答