【问题标题】:Which user is used in trusted connection to SQL Server - IIS/ASP.NET哪个用户用于与 SQL Server 的受信任连接 - IIS/ASP.NET
【发布时间】:2016-08-26 22:56:24
【问题描述】:

先介绍一下背景。我有一个 ASP.NET 应用程序,它位于我们网络的 DMZ 中。它需要访问位于我们受信任网络中的机器上的 SQL Server 实例。我将调用 Web 服务器 WebServer1 和一个示例 SQL Server SqlServer1

目前,我们的网络服务器正在使用包含用户 ID 和密码的连接字符串。这并不理想,我们希望使用 Windows 身份验证来连接数据库。

为此,我在我们的域上设置了一个用户帐户和密码,我将其命名为MyDomain\WebApp。我将我们站点的应用程序池的身份设置为这个新帐户,并将站点的匿名身份验证设置为使用应用程序池的身份。

但是,当我尝试更改我们的连接字符串,将 UserID=fakeuser, Password=fakepass 替换为 Trusted_Connection=Yes 时,从 Web 应用程序启动数据库调用会导致错误消息

登录失败。登录来自不受信任的域,不能用于 Windows 身份验证。

编辑:这是来自 SQL Server 错误日志的完整错误消息:

在建立具有集成安全性的连接时,SSPI 握手失败,错误代码为 0x8009030c,状态 14;连接已关闭。原因:AcceptSecurityContext 失败。 Windows 错误代码指示失败的原因。登录尝试失败 [CLIENT: ]

错误:18452,严重性:14,状态:1。

登录失败。登录来自不受信任的域,不能用于 Windows 身份验证。 [客户:]

为了看看发生了什么,我想我应该设置一个简单的页面来告诉我当前用户在工作进程中是什么。这是我遇到非常奇怪的结果的地方。以下是结果及其提供它们的服务器变量(实名替换为上述名称)

  1. WebServer1\WebApp = WindowsIdentity.GetCurrent().Name
  2. WebApp = Environment.UserName
  3. 我的域\WebApp = pool.ProcessModel.UserName
  4. WebServer1\WebApp = Request.LogonUserIdentity.Name

1 和 4 很奇怪,在 Web 服务器上不作为用户帐户存在。只有#3 返回在站点的 IIS 应用程序池中看到的正确值。这是使用以下 SO 答案的评论中的方法获得的:https://stackoverflow.com/a/10101417/711674

我的假设是,当服务器尝试对 SQL Server 实例进行身份验证时,实际使用的不是该帐户,并且正在使用其他值之一,从而导致上述错误消息。

【问题讨论】:

  • 检查您的 IIS“匿名身份验证”设置并确保将其设置为“使用应用程序池标识” - IIS 和 ASP.NET 执行身份模拟。
  • 您的应用程序使用什么身份验证系统?您是在使用自己的身份验证数据库,还是在使用 Windows 身份验证(在 ASP.NET 中 - 与 SQL Server 无关)?如果是这样,您可能碰壁了:在 Web 应用程序中让 Windows 身份验证与 Impersonation 和 SQL Server 一起工作是很困难的。
  • 我们在数据库中使用我们自己的身份验证。我们目前在 web.config 中使用连接字符串并指定用户和密码来连接到数据库,这工作正常。但是,我想使用受信任的连接,而不是连接字符串中没有用户/密码。这很难吗?如果是这样,最安全的选择是什么?感谢您的帮助。
  • 另外,作为对您的第一条评论的回应,谢谢您,它确实被设置为错误的用户(这就是管理员用户必须来自的地方)有人一定是这样设置的回到第一次配置的时候。我将相应地编辑我的问题。但是,当从 Web 应用程序进行没有用户/密码的数据库连接时,我仍然收到相同的错误,并且我的问题中的 #4 现在显示“WebServer1\WebApp”
  • 应用程序池设置为域用户的全名账户。但是,我开始认为,由于网络配置,我们的 Web 服务器位于 DMZ 上,而我们的 DB 服务器位于受信任的内部网络上,因此该计划可能无法运行。当我设置模拟以使用包含密码的 MyDomain\WebApp 身份Could not create Windows user token from the credentials specified in the config file. Error from the operating system 'Logon failure: unknown user name or bad password 时,我设法在我们的测试站点中导致错误

标签: sql-server iis iis-7.5 sql-server-2014 windows-authentication


【解决方案1】:

有一篇关于此事的好文章here。简而言之:

您需要回答两个主要问题:

  1. IIS 的身份验证模式是什么? (匿名身份验证?Windows 身份验证?两者都有?)

  2. 是否模拟了FastCGI 模块onoff? (即我的php.ini 文件中的fastcgi.impersonate 设置是否设置为01?)

A. IIS 匿名身份验证已启用且fastcgi.impersonate = 1

因为我是匿名连接到 IIS,所以内置的匿名 帐户(在 IIS 7.0+ 中默认为 NT AUTHORITY\IUSER)是 冒充。所以,我的连接尝试失败了,因为这个身份 没有映射到我服务器上的有效登录。

B. IIS 匿名身份验证已启用且fastcgi.impersonate = 0

因为假冒已关闭,我的身份没有被用作 PHP 进程的标识。相反,PHP 的实际身份 在连接尝试中使用了进程。在 IIS 7.5 中,标识 PHP 进程的身份取决于它的应用程序池的身份 正在运行。在这种情况下,PHP 在默认应用程序池中 并且连接尝试中使用的身份是IIS APPPOOL\DefaultAppPool(所以我的连接尝试失败了)。

C. IIS Windows 身份验证启用和fastcgi.impersonate = 1

启用 Windows 身份验证(和匿名身份验证) 禁用),我使用我的 Web 浏览器的身份连接到 IIS 在(Microsoft\brian.swan,我登录的身份下运行 和)。并且,在启用模拟的情况下,PHP 进程在 Microsoft\brian.swan 身份。因此,由于该身份映射到 在我的服务器上有效登录,我的连接尝试成功。

D. IIS Windows 身份验证已启用且fastcgi.impersonate = 0

这里的结果与匿名身份验证相同 启用和fastcgi.impersonate =0(连接尝试失败)。 唯一的区别发生在我从 Web 请求页面时 服务器:当我请求时,弹出窗口询问我的身份 页面。

E. 匿名和 Windows 身份验证均已启用:

Web 浏览器将尝试使用匿名访问 Web 服务器 先认证。所以,如果匿名和 Windows 身份验证 都启用,结果将与上面的相同 启用匿名身份验证(A 和 B)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多