SqlException: 用户“NT AUTHORITY\NETWORK SERVICE”登录失败。

11

当我通过VS 2008运行Web应用程序时,该应用程序能够登录Sql服务器并检查用户输入的凭据(用户名和密码),但是当我通过IIS 7浏览此应用程序并尝试提交用户名和密码时,应用程序报告异常:

System.Data.SqlClient.SqlException: Login failed for user 'NT AUTHORITY\NETWORK SERVICE'

  • 在IIS 7下,每个进程都在Network Service帐户下运行......那么我需要为此帐户分配什么权限,使应用程序能够“联系”到Sql服务器?

谢谢

编辑:

你好,

现在它可以工作了,虽然我不明白为什么机器账户需要这些权限。我知道机器账户需要一些权限才能与特定程序(如Sql服务器)进行“交流”,但为什么需要访问数据库及其表的权限呢?难道不是由连接字符串中指定的帐户决定吗?

<add name="MyConnection" connectionString="data source=localhost; integrated security=sspi; initial catalog=aspnetdb;" />

如何拥有适当的访问数据库及其表的权限?


2
SourceC,你的连接字符串没有使用特定的用户名/密码组合,因此它正在使用Windows集成安全性。当在连接字符串中使用集成安全性时,应用程序将使用Web应用程序应用程序池正在运行的帐户连接到数据库。如果您希望使用调用者的身份,则需要了解ASP.NET模拟-虽然我不建议使用这种方法,因为使用此方法存在各种缺点。根据您的要求,您可能希望在连接字符串中使用用户名密码组合。 - RichardOD
7个回答

20
您需要为 Network Service 账户在 SQL Server 中创建一个账户。您将授予该账户访问数据库的权限,授予权限的具体内容取决于数据库需要执行的任务的性质。
您可以在 SSMS 的“安全性”部分中完成所有操作,右键单击“登录”,然后选择添加。您将添加一个 Windows 账户,然后查找并验证“NETWORK SERVICE”名称。然后切换到“用户映射”部分,并授予其访问您的数据库的权限。权限由您决定,或者您可以分配 dbowner 权限以获取完全控制权。
完成这些操作后,您就可以放心使用了。我建议不要给应用程序赋予比所需权限更多的权限!

9

我个人建议将Web应用程序运行在自定义服务帐户下。如果您真的想要将其运行在Network Service下,请参阅此MSDN文档


8
由于您在连接字符串中指定了“integrated security=sspi”,我猜您期望进行模拟。但是,为此,您应该: 1. 在IIS中启用集成身份验证。 2. 在asp.net中启用Windows身份验证:
3. 在asp.net中启用模拟:
还要考虑到,如果您的Web服务器和SQL Server机器是不同的机器,则需要信任您用户的帐户以进行委托。这是AD中的特殊选项。
因此,已经告诉您最好为SQLSRV连接使用单独的帐户。 希望这可以帮助您。

所以当我通过Sql Server管理工具登录(作为用户U)Sql Server时,Server Management Studio(或其他某些服务)会假定用户U的身份吗?如果是这样,那么我会认为Sql Server不仅要求进程P1(尝试与此Sql Server“通信”)提供适当的凭据(用户名U1和密码),而且还要求P1以用户U1的身份运行?但那么Sql Server为什么要求P1提供适当的凭据呢?为什么不只是检查P1是否以U1身份运行,如果是,则让P1“进入”? - SourceC
请注意,确保您理解模拟和委派是什么。请查看以下链接: http://msdn.microsoft.com/en-us/library/ms998351.aspx http://www.infosysblogs.com/microsoft/2009/02/impersonation_and_delegation_t.html - Shrike

3

我建议创建一个服务账户,并让您的IIS 7进程以该账户运行。确保该账户具有适当的访问权限,如果只是读取数据库,则为DB-Reader(如果读取和更新,则为DB-Reader和DB-Writer)。


2

我在使用全新的IIS时遇到了相同的错误。我使用了"integrated security=false;User Id=sa;Password=yourpassword",一切都运行良好。


sa用户应该保留用于管理任务。 - GnomeCubed

2

当您使用IIS配置应用程序,并且IIS尝试使用没有适当权限的凭据登录SQL Server时,就会出现此错误。此错误也可能在设置复制或镜像时发生。

我将介绍一种始终有效且非常简单的解决方案。

转到SQL Server >> Security >> Logins,右键单击NT AUTHORITY\NETWORK SERVICE并选择属性。

在新打开的“登录属性”屏幕中,转到“用户映射”选项卡。然后,在“用户映射”选项卡上,选择所需的数据库,特别是显示此错误消息的数据库。在下面的屏幕上,检查角色db_owner。点击确定。


0
在一个SharePoint项目中,我遇到了这个问题。集成安全已经开启,数据库已配置允许应用程序池的用户访问。
问题是需要关闭模拟身份验证,但却开启了。这个答案指引了我正确的方向:
WindowsImpersonationContext noImpersonateContext = null;

try
{
    noImpersonateContext = WindowsIdentity.Impersonate(IntPtr.Zero);
    using (SqlConnection conn = CreateConnection())
    {
        // database calls...
    }
}
finally
{
    if (noImpersonateContext != null) noImpersonateContext.Undo();
}

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