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

时间:2019-01-22 22:56:48

标签: asp.net sql-server iis asp.net-core windows-authentication

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

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

调试时一切正常,但是发布到IIS时,出现以下错误:

SqlException: Login failed for user '<DOMAIN>\<COMPUTERNAME>$'.

其中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
    }
  },

在appsettings.json中,我有:

  "ConnectionStrings": {
    "MyDB": "Server=<servername>;Database=<dbname>;Trusted_Connection=True;"
  },

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

            services.AddDbContext<MyContext>(options => {
                options.UseSqlServer(Configuration.GetConnectionString("MyDB"));
            });

然后,从那里开始,我使用Entity Framework为MVC控制器提供了视图。

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

编辑:问题所在

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

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

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

5 个答案:

答案 0 :(得分:0)

您将实体框架用于SqlServer,而EF使用ADO.NET SqlClient。因此Trusted_Connection=yes;不起作用。

改为添加Integrated Security=true;,它应该是固定的。

这里有一些资源可以阅读 https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/connection-string-syntax

答案 1 :(得分:0)

了解了更多有关.NET以及Windows auth在IIS上实际执行的操作之后,我要说的是,不建议我尝试这样做。将Windows凭据传递给.NET应用程序以便从中读取信息与实际以该用户身份执行辅助进程之间有区别。后一种情况是我试图做的,但是应该在IIS中设置我的应用程序池,该用户可以登录数据库,并使用Windows凭据来验证具有访问权限的用户列表。 >

答案 2 :(得分:0)

不挖掘旧线程,但是只要设置了Identity Impersonate = True,该函数就应该起作用。这是一些正在处理的东西。

GitHub Doc

答案 3 :(得分:0)

第1步(打开设置设置文件),添加 Integrated Security = true; ,如下所示

  

{“ ConnectionStrings”:{“ MatcoDashboard”:   “服务器=计算机名\ MSQL2008R2;数据库=数据库名称   ; Integrated Security = true; “},

步骤-2 Copy your application pool name IIS APPPOOL\matco

您的应用程序池名称= IIS APPPOOL \ matco

步骤-3 转到Sql Server Management Studio,使用Windows身份验证创建新用户“ IIS APPPOOL \ matco” ,然后使用数据库映射显示以下图像详细信息步骤

步骤1 create new user

步骤2 create new user with name IIS APPPOOL\matco

步骤3 User Mapping with Database

转到IIS浏览您的页面

答案 4 :(得分:0)

我会添加我的答案,因为我就是这样解决这个问题的。
将“$”符号添加到登录名/用户的原因必须与托管应用程序的 IIS 有关。

我不是这方面的专家,所以我不能真正深入,但我已经将 IIS 用户添加到登录名,然后它就可以工作了。

USE [master]
GO

CREATE LOGIN [IIS APPPOOL\'name'] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
GO

ALTER SERVER ROLE [sysadmin] ADD MEMBER [IIS APPPOOL\'name']
GO

ALTER SERVER ROLE [securityadmin] ADD MEMBER [IIS APPPOOL\'name']
GO

ALTER SERVER ROLE [serveradmin] ADD MEMBER [IIS APPPOOL\'name']
GO

ALTER SERVER ROLE [setupadmin] ADD MEMBER [IIS APPPOOL\'name']
GO

ALTER SERVER ROLE [processadmin] ADD MEMBER [IIS APPPOOL\'name']
GO

ALTER SERVER ROLE [diskadmin] ADD MEMBER [IIS APPPOOL\'name']
GO

ALTER SERVER ROLE [dbcreator] ADD MEMBER [IIS APPPOOL\'name']
GO

ALTER SERVER ROLE [bulkadmin] ADD MEMBER [IIS APPPOOL\'name']
GO  

您必须将“名称”更改为您的 IIS 托管应用程序名称。例如,如果您在 ISS 中的应用/站点名称是“My-Backend-App”,您应该这样做:

CREATE LOGIN [IIS APPPOOL\My-Backend-App] FROM WINDOWS ...  

所以所有的名字都应该是“My-Backend-App”。

将此用户添加到登录时,我的后端应用程序可以访问和创建数据库、创建表、访问数据等...

旁注:我使用 Windows 事件记录器发现这是我的问题。我的应用程序刚刚崩溃,显示“500.30”错误,但没有给出真实信息。

您可以从 Windows 搜索访问“事件查看器”应用程序。然后您可以转到“应用程序”,您的机器上发生了所有应用程序错误/崩溃,在这种情况下也是原因。它说在尝试登录 SQL 时找不到用户“myUser$”,但 Windows 身份验证用户是“myUser”。所以出于某种原因,它添加了一个“$”-sign 并且无法登录。我上面的修复解决了这个问题,你可以登录等。