为啥 IIS 中的 Windows/集成身份验证不将用户凭据传递给 s-s-rS 和 SQL?

Posted

技术标签:

【中文标题】为啥 IIS 中的 Windows/集成身份验证不将用户凭据传递给 s-s-rS 和 SQL?【英文标题】:Why does Windows/Integrated Authentication in IIS not pass user credentials to s-s-rS and SQL?为什么 IIS 中的 Windows/集成身份验证不将用户凭据传递给 s-s-rS 和 SQL? 【发布时间】:2011-09-16 02:26:01 【问题描述】:

问题: 在 ASP.NET 4.0 中,我使用我的 s-s-rS 2005 服务器的ReportService2005.asmx Web 服务来获取报告列表。同样在 .NET 中,我使用 Entity Framework 与我的 MS-SQL 2005 数据库进行通信。当我使用 Visual Studio Development Server 作为我的 Web 服务器时,对 s-s-rS 和 SQL 的调用工作正常。但是当我切换到 IIS 5.1 时,s-s-rS 和实体代码都会产生错误。我在 IIS 中仅使用 Windows/集成身份验证。

错误: 对于s-s-rS,我得到The request failed with HTTP status 401: Unauthorized.

对于实体框架,我得到Login failed for user ''. The user is not associated with a trusted SQL Server connection.

尝试的解决方案: 在 Web.Config 中,我添加了 <identity impersonate="true" /> 并修复了实体框架错误,但没有修复 s-s-rS 错误。我扩展了 identity 引用以包含 my 用户名和密码,并且修复了所有错误。

问题: 为什么指定我的用户名和密码可以修复错误,为什么 SQL 说我没有指定用户名 ('')?我认为 Windows 身份验证会自动模拟当前用户。如何在不将“服务”帐户硬编码到 web.config 中的情况下解决此问题?

【问题讨论】:

【参考方案1】:

Windows 或集成身份验证意味着使用 Windows 凭据(或令牌)来识别用户,但这并不意味着请求在该用户下运行。 ASP.NET 运行时将在工作进程(应用程序池)身份下执行请求,除非您将其配置为模拟其他身份。

因此,当您使用开发服务器访问站点时,服务器以您的身份运行,因此对 s-s-rS 和 Sql Server 的访问是在您的身份下完成的,并且可以正常工作。

当您在 IIS 下加载站点时,ASP.NET 请求将在为应用程序池配置的任何身份下运行。通常,此身份是本地用户,因此对网络资源(如 s-s-rS 或 Sql Server)的访问将被拒绝。添加<identity impersonate="true" username="your name" ../>,ASP.NET 将以您的身份运行请求,这应该适用于 s-s-rS 和 Sql Server。

这里奇怪的例子是<identity impersonate="true" /> - 在这个设置下,ASP.NET 将模拟当前经过身份验证的 Windows 身份。但是,为了使其正常工作,您已在集成身份验证上配置 IIS 和 ASP.NET,并拒绝匿名访问(在 ASP.NET 和 IIS 中)。不这样做可能会导致无法验证当前用户的身份,并且请求将在匿名用户的身份下运行(如 IIS 中配置的那样)。如果您在 IIS 中而不是在 ASP.NET 中标记了集成身份验证,则不会将身份传递给 ASP.NET 请求。您需要检查您的环境以了解您所面临的确切情况,但最终结果是您的 ASP.NET 请求在可以访问 SQL Server 但不能访问 s-s-rS 的凭据下运行。

【讨论】:

你是对的。我最终在 web.config 中使用 <identity impersonate="true" />((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate() 作为对 s-s-rS 的引用,并且正确地冒充了我。【参考方案2】:

您还需要注意“双跳”问题 - 这意味着您的凭据只能使用两次。

如果您正在使用 Windows 身份验证和模拟访问网站,则该网站可以像您一样调用其他服务。如果该其他服务是另一个网站(即 Reporting Services),而该网站又调用另一个服务(例如数据库),则它无法再次传递您的凭据。这意味着如果数据库需要用户提供凭据,它将引发错误。

【讨论】:

以上是关于为啥 IIS 中的 Windows/集成身份验证不将用户凭据传递给 s-s-rS 和 SQL?的主要内容,如果未能解决你的问题,请参考以下文章

IIS Windows集成身份验证替代方法?

IIS 7 中的 Kerberos 身份验证

为啥 cURL 不适用于 IIS7 上的 Windows 身份验证?

与 IIS、Firefox 和 SQL Server 集成的 Windows 身份验证

node.js 客户端中的 Windows 集成身份验证

我在服务器上的iis上的身份验证选项中去掉了匿名访问,启用了集成windows身份验证