IIS 无法将 Windows 凭据传递到 SQL Server for ASP.NET Core 应用程序

Aia*_*ias 5 sql-server asp.net iis windows-authentication asp.net-core

我在一家大公司工作,每个人都有 Intranet 和 Windows AD 登录。我们有许多内部 SQL Server 数据库,允许我们使用 Windows 身份验证登录,我正在尝试通过 ASP.NET Core 应用程序连接到其中之一。我可以通过 SQL Server Management Studio 连接到该数据库并很好地查询表。

我尽可能严格地遵循使用现有数据库的 ASP.NET Core 应用程序教程,并创建了一个模型类来进行测试,看看是否可以从数据库读取数据。在 Visual Studio 中使用 IIS Express 进行调试时,我可以在访问自动生成的控制器和视图时从数据库读取数据。

调试时一切似乎都很好,但是当发布到 IIS 时,我收到以下错误:

SqlException: Login failed for user '<DOMAIN>\<COMPUTERNAME>$'.
Run Code Online (Sandbox Code Playgroud)

其中domain是我的域,computername是我的计算机的名称。这是预期的,因为我的计算机本身无法访问数据库。但它不应该尝试使用该系统帐户(带有美元符号)进行连接,它应该尝试与我的 Windows 帐户连接:<DOMAIN>\<USERNAME>。

更奇怪的是,该应用程序似乎确实以某种方式识别了我的 Windows 凭据 - 当我访问主页时,我"Hello, <DOMAIN>\<USERNAME>!"在导航栏中看到了熟悉的消息。因此,Windows 凭据肯定会传递到应用程序,但由于某种原因在尝试通过 DbContext 连接到数据库时没有传递。

我在这里遗漏了一些明显的东西吗?

我的代码

我从 Visual Studio 的 ASP.NET Core Web 应用程序模板开始。

在 launchSettings.json 中,我有:

  "iisSettings": {
    "windowsAuthentication": true, 
    "anonymousAuthentication": false, 
    "iisExpress": {
      "applicationUrl": "http://localhost:60686",
      "sslPort": 44336
    }
  },
Run Code Online (Sandbox Code Playgroud)

在 appsettings.json 中,我有:

  "ConnectionStrings": {
    "MyDB": "Server=<servername>;Database=<dbname>;Trusted_Connection=True;"
  },
Run Code Online (Sandbox Code Playgroud)

在 Startup.cs 中,我有以下行ConfigureServices

            services.AddDbContext<MyContext>(options => {
                options.UseSqlServer(Configuration.GetConnectionString("MyDB"));
            });
Run Code Online (Sandbox Code Playgroud)

从那里,我使用实体框架搭建了一个带有视图的 MVC 控制器。

IIS 将 Windows 身份验证设置为“是”,将匿名身份验证设置为“否”。我的应用程序池通过 ApplicationPoolIdentity 设置为“无托管代码”。

编辑:问题

为了说明我试图解决的实际问题,我在远程 Intranet 服务器上有一个 SQL Server 数据库,该数据库允许通过 Windows 身份验证访问整个公司的子集。如果我想创建一个 ASP.NET 应用程序来向由 IIS 托管的数据库提供 API,那么最好的方法是什么?假设:

  1. 我不想自己管理权限或以某种方式复制它们
  2. 可以直接访问数据库的人应该可以访问 API,不能直接访问数据库的人则不能。
  3. 如果他们在登录 Windows 时从 Intranet 内访问它,则不必再次登录。

我以为我可以通过应用程序将他们的 Windows 凭据从 IIS 传递到 SQL Server,但我开始怀疑是否确实如此。

Aia*_*ias 2

在详细了解 .NET 以及 Windows 身份验证在 IIS 上的实际作用后,我想说的是,不推荐我尝试做的事情。将 Windows 凭据传递给 .NET 应用程序以便从中读取数据与以该用户身份实际执行辅助进程之间存在差异。后一种情况是我想要做的,但应该使用可以登录数据库的用户在 IIS 中设置我的应用程序池,并使用 Windows 凭据来验证有权访问的用户列表。