c# - asp.net core 2.1, C# app, c# web service, 访问SQL数据库
问题描述
我整个星期都在与以下问题作斗争,并希望有人能提供帮助。我的申请分为三个部分。
- 一个 SQL 数据库(自己的机器),
- Web 服务(IIS 机器)和
- 应用程序本身(也在与 Web 服务相同的 IIS 上)。
应用程序与 Web 服务对话,后者又从 SQL 数据库中获取数据。我正在使用 Windows 身份验证。当应用程序在我的机器上本地运行时,它会毫无问题地从 Web 服务接收数据。当我在 Web 服务器上托管应用程序(应用程序和 Web 服务都托管在同一台机器上)时,我收到 401(身份验证)错误。
在应用程序中,我获得了控制器中使用的当前 Windows 用户:
System.Security.Claims.ClaimsPrincipal currentUser = this.User;
WindowsIdentity identity = (WindowsIdentity) currentUser.Identity;
要访问 Web 服务(进而访问数据库),我使用以下代码:
await WindowsIdentity.RunImpersonated(identity.AccessToken, async () =>
{
request = new HttpRequestMessage(HttpMethod.Get, uri);
});
我已经在 IIS 上检查了当代码在服务器上运行时我得到了正确的身份 -> 我确实得到了 Windows 用户而不是 IIS AppPool 用户(在我换成使用 System.Security 之前我已经得到了它。 Claims.ClaimsPrincipal)。
我知道问题是尽管我使用了正确的用户,但身份并未传递给 Web 服务。有任何想法吗?
解决方案
好的,所以经过大量在线研究后,我发现了问题。自 2003 年以来,Microsoft 对中间人攻击实施了环回检查——这给我带来了问题,因为我的 FQDN 与 URL 基地址不同。我停用了此检查(http://artykul8.com/2010/01/windows-server-iis-sharepoint-and-null-sid-audit-failures/),现在我的凭据正在正确传递。由于这是一个测试服务器,我对此解决方案没有任何问题:)