用户“ DOMAIN MACHINENAME $”登录失败

我知道这几乎是一个副本: ASP.NET 和 SQLServer2008中的错误“ Login false for user & # 39; NT AUTHORITY IUSR & # 39;”用户在外部项目/类库中使用 LINQ 登录失败,但有些东西不加起来比其他应用程序在我的服务器上,我不知道为什么。

使用的盒子:

网络信箱
SQL Box
SQL 测试框

我的申请:

我有一个 ASP.NET Web 应用程序,它引用了一个使用 LINQ-to-SQL 的类库。在类库中正确设置连接字符串。根据 用户在外部项目/类库中使用 LINQ 登录失败,我还将这个连接字符串添加到 Web 应用程序。

连接字符串使用 SQL 凭据(在 web 应用程序和类库中) :

 <add name="Namespace.My.MySettings.ConnectionStringProduction"
connectionString="Data Source=(SQL Test Box);Initial Catalog=(db name);Persist Security Info=True;User ID=ID;Password=Password"
providerName="System.Data.SqlClient" />

此连接通过将其添加到服务器资源管理器确认可以工作。这是连接字符串 my。Dbml 文件正在使用。

问题是:

我得到以下错误:

System.Data.SqlClient.SqlException: Login failed for user 'DOMAIN\MACHINENAME$'.

现在引用这个 ASP.NET 和 SQLServer2008中的错误“ Login false for user & # 39; NT AUTHORITY IUSR & # 39;”它说,这是真正的本地网络服务和使用任何其他非域名将不起作用。

但是我很困惑,因为我已经检查了 SQL Box 和 SQL Test Box SQL Management Studio,它们都在 Security-> Logins 下面有 NT AUTHORITY/NETWORK SERVICE,在数据库级别,它没有列在 Security-> Users 下面,但是在数据库级别 Security-> Users 我在连接字符串中显示了用户。

在网络服务器上的 NTFS 级别上,权限具有 NETWORKSERVICE 的完全控制权。

我感到困惑的原因是因为在我的 Web 服务器上有许多其他 Web 应用程序,在 SQL Box 和 SQL Test Box 上都有引用数据库,而且它们都可以工作。但是,除了使用类库之外,我找不到它们与当前应用程序之间的区别。这重要吗?检查 NTFS 权限、在服务器和数据库级别设置安全登录、连接字符串和连接方法(SQLServer 凭据)以及 IIS 应用程序池和其他文件夹选项都是相同的。

为什么这些应用程序不需要将机器名 $添加到我的任何一个 SQL 框的权限中就可以工作?但是,这就是一个链接告诉我要做的,以解决这个问题。

206138 次浏览

NETWORK SERVICE 和 LocalSystem 将始终作为相应的本地帐户(内置网络服务和内置系统)进行身份验证,但两者都将作为远程机器帐户进行身份验证。

如果您看到像 Login failed for user 'DOMAIN\MACHINENAME$'这样的故障,这意味着作为 NETWORK SERVICE 或 LocalSystem 运行的进程访问了远程资源,作为机器帐户进行了身份验证,并被拒绝授权。

典型的例子是在应用程序池中运行的 ASP 应用程序,它使用 NETWORK SERVICE 凭证并连接到远程 SQL Server: 应用程序池将作为运行应用程序池的 机器进行身份验证,并且这个机器帐户需要被授予访问权限。

当拒绝访问计算机帐户时,必须授予对该计算机帐户的访问权。如果服务器拒绝登录“ DOMAIN MACHINE $”,那么您必须将登录权限授予“ DOMAIN MACHINE $”,而不是授予网络服务。授予对 NETWORK SERVICE 的访问权限将允许作为 NETWORK SERVICE 运行的 本地进程进行连接,而不是远程进程,因为远程进程将验证为,您猜测的,DOMAIN MACHINE $。

如果您期望 asp 应用程序以 SQL 登录名的形式连接到远程 SQL Server,并且您得到了关于 DOMAIN MACHINE $的异常,那么这意味着您在连接字符串中使用 IntegrationSecurity。如果出现意外情况,则意味着您搞砸了所使用的连接字符串。

我的诀窍是从我的连接字符串中删除 Integrated Security,并添加一个常规的 User ID=userName; Password=password你的连接字符串在您的库的 App.config可能不使用集成安全,但在 Web.config中创建的一个是!

我将 <identity impersonate="true" />添加到 web.config 中,它工作得很好。

使用 IIS 配置应用程序时,如果 IIS 转到 SQLServer 并尝试使用没有适当权限的凭据登录,则会发生此错误。设置复制或镜像时也可能发生此错误。 我将讨论一个解决方案,始终工作,是非常简单的。 转到 SQL Server > > Security > > Logins,右键单击 NT AUTHORITY NETWORK SERVICE 并选择 Properties

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

一位同事也出现了同样的错误,这是由于 IIS 中的一个小配置错误。
为 Web 应用程序分配了错误的应用程序池。

实际上,我们使用具有特定标识的自定义应用程序池来满足我们的需求。

在他的本地 IIS 管理器-> 网站-> 默认网站-> 我们的网络应用程序名称-> 基本设置..。 应用程序池是“ DefaultAppPool”,而不是我们的自定义应用程序池。

设置正确的应用程序池解决了这个问题。

我们在处理 AnalysisServices 数据库时收到了类似的错误消息。用于运行 AnalysisServices 实例的用户名没有添加到 SQLServer 的安全登录名中。

在 SQLServer2012中,SQLServer 和 Analysisservices 被配置为默认情况下作为不同的用户运行。如果您已经使用了默认设置,请始终确保 AS 用户可以访问您的数据源!

对我来说,当我将默认的内置帐户“ ApplicationPoolIdentity”替换为允许访问数据库的网络帐户时,问题就解决了。

可在「互联网资讯服务器」(IIS7 +) > 应用程式池 > 高级设定 > 处理模式 > 识别

我之前遇到过同样的问题,从 Connectionstring 中删除 Persist Security Info=True对我来说很有用。

我花了几个小时试图解决这个问题,最终我得到了它—— SQLServer 浏览器被“停止”了。解决办法是将其更改为“自动”模式:

如果它被禁用,转到控制面板-> 管理 工具-> 服务,并查找 SQLServer 代理。右击,然后 选择“属性”。从“启动类型”下拉菜单中,从 “禁用”到“自动”。

引自这里

看看有没有

User Instance=true

在连接字符串。尝试删除它将解决您的问题。

在我的情况下,我有我的 IIS 应用程序池 Identity="ApplicationPoolIdentity"

在我将 IIS APPPOOL\ApplicationName用户添加到 SQLServer 之后,它就可以工作了。

基本上,为了解决这个问题,我们需要设置

  • 在 ApplicationPoolIdentity 下运行的 Web 应用程序
  • Web 应用程序通过 ADO.Net 使用连接字符串中的 Windows 身份验证连接到数据库

与 Windows 身份验证一起使用的连接字符串包括 Web.config文件中的 Trusted_Connection=Yes属性或等效属性 Integrated Security=SSPI

我的数据库连接处于 Windows 身份验证模式。因此,我通过简单地将 申请人数 Identity 从 应用程序池身份更改为域日志凭据 域名 MyloginId来解决这个问题

步骤:

  1. 点击 申请人数
  2. 选择应用程序的名称

  3. 转到 高级设置

  4. 展开 过程模式并单击 身份。单击三 点在右端。
  5. 单击 预备..。按钮并提供 您的域登录凭据

对我来说已经解决了。

注意: 在生产环境或 IT 环境中,您可能在同一域下有应用程序池标识的服务帐户。如果是这样,使用服务帐户而不是您的登录。

我在使用 SQLServer 身份验证用户时也出现了这个错误

我尝试了一些修复方法,但它们不起作用。

我的解决方案是在 ManagementStudio: Properties/Security 下配置其“ Server Authentication Mode”以允许 SQL Server 身份验证。

似乎每个人都忽略了一点,那就是您可能需要集成安全 = 真。您可以在池帐户下运行站点。这一切都很好,因此仍然有可能使用原始用户凭证而不是池的凭证访问 SQL 服务器。这叫做约束授权。如果您启用它并设置一个 SPN 窗口,将把池的凭据与用户的请求转换为最终服务(SQL 就是这样的服务之一)。您必须注册在 Web 服务器上服务 SQL 请求的 ONE AND ONLY SQL 服务器。设置这一切对我来说太多了,无法在这里准确地描述。我自己也花了不少时间。

对于我的问题与’域机器名 $’修复设置为 DefaultApplicationPool身份为 NetworkService

enter image description here

当客户端重命名 SQLServer 时,我遇到了这个问题。SQL ReportingService 被配置为连接到旧服务器名称,它们还为重定向到新服务器名称的 IP 的服务器名称创建了别名。

所有旧的 IIS 应用程序都正常工作,通过别名重定向到新的服务器名称。凭直觉,我查了他们是否在运行战略科学储备系统。试图连接到 SSRS 站点导致错误:

“这项服务不可用。联系你的系统管理员来解决这个问题。系统管理员: 报表服务器无法连接到其数据库。确保数据库正在运行并可访问。您还可以查看报表服务器跟踪日志了解详细信息。”

它在服务器上运行,但由于使用旧服务器名称的别名而无法连接。重新配置 SSRS,使用新的服务器名称,而不是固定的旧/别名。

  1. 将应用程序池标识更改为本地系统
  2. 关于 SQL Mgmt > 安全性 > 登入
    1. 双击查找 NT 授权系统
    2. 用户映射 > 检查您的数据库并在下面赋予它一个角色。
    3. 记住还要创建用户数据库 o 安全登录,使用正确的密码。

我在尝试使用以下方法测试解决方案时出现了这个错误

string cn = "Data Source=[servername];Integrated Security=true;Initial Catalog=[dbname];";

我解决这个问题的方法是: 我必须打开 Visual Studio 并在另一个帐户下运行它,因为我用来打开的帐户不是我的管理员帐户。

因此,如果您的问题与我的相似: 将 VS 固定在任务栏上,然后使用 Shift 和 Right Click 打开菜单,这样您就可以以另一个用户的身份打开 VS。 enter image description here

感谢这里有一些很好的答案,但是我已经失去了时间来解决这个问题,希望这能帮助到某些人。

在我的情况下,一切都运行良好,然后停止没有明显的原因与错误陈述的问题。

IIS 以网络服务的形式运行,而网络服务以前已经在 SQLServer 上设置好了(请参阅本文的其他答案)。服务器角色和用户映射看起来是正确的。

这个问题是; 绝对没有明显的原因; 网络服务已经切换到“拒绝”登录权在数据库中。

修正:

  1. 开启 SSMS > 保安 > 登入。
  2. 右键单击“ NTAuthorityNetworkSERVICE”,然后单击“属性”。
  3. 转到“状态”选项卡并将 Permission to Connect To Database Engine设置为“授予”。

Network Service Allowed

在这里添加一个新的答案,因为以前的答案没有解释我的问题。问题是 SQL 中需要的用户名是 应用程序池的名称,而不是其标识

我在 IIS 中运行,AppPools 设置为 ApplicationPoolIdentity标识。

我的具有访问权限的 SQL 安全用户名称为 IIS APPPOOL\DefaultAppPool,它与 ASP.NET Full Framework 一起工作得很好。网上申请。

在启动我的 ASP.NET Core 应用程序时,它创建了一个新的应用程序名称的 AppPool,但没有 CLR 版本,仍然使用相同的 ApplicationPoolIdentity标识。

但是在查看了通过 System.Security.Principal.WindowsIdentity.GetCurrent().Name使用的用户名之后,我意识到它并没有使用 DefaultAppPool,而是使用了新的应用程序池名称。因此,我必须在 SQL 安全选项卡中添加一个名为 IIS APPPOOL\ApplicationName的新用户,而不是默认用户。

我的问题出现在 VisualStudio 中的发布设置中。我的 appsetings.json 连接字符串是正确的,但是发布设置中的 Database 连接字符串集成了 security = true。

我让 MACHINE $帐户成为 SQL 服务器上 sysadmin 角色的一部分,但它没有帮助。服务器在同一台计算机和 IIS 上。应用程序池标识设置为“网络服务”。

帮助我的是将应用程序池从集成模式改为经典模式。

您可以使用网络服务或经过身份验证的用户。
然后给出 Server Roles = > public 和 sysadmin
然后给 User Mapping = > select your database and
检查 public 和 db _ owner。

我在吸毒。NET Core 3.1使用一个单独的服务 ID (AD)连接到数据库,它在 Visual Studio 2019中工作,但在测试或生产服务器中不工作。

下面所做的修改为我工作了,也找到了连接的细节

"Server=ServerName;Database=dBName;Integrated Security=True;Trusted_Connection=True;User Id=DOMAIN\\ServiceId;Password=**********;MultipleActiveResultSets=True"

然后. . 更改在服务 ID 上运行的带有 Identity 的应用程序池。

在此输入图像描述

我已经正确地指定了所有的设置(AppPool 标识、网站上的 AppPool、 AppPool 的登录等等) ,但是当我用 PowerShell 创建 AppPool 登录时,我忘记授予用户连接权限(-GrantConnectSql) ,默认情况下是禁用的。

Add-SqlLogin -ServerInstance "." -LoginName $AppPoolUser -LoginType "WindowsUser" -Enable -GrantConnectSql

为了手动解决这个问题:

  • 打开 SSMS
  • 连接到服务器
  • 浏览保安 > 登入
  • 打开 AppPool 用户的属性
  • 在“状态”标签下
  • 将“连接到数据库引擎的权限”设置为“授予”