我在一家大公司工作,每个人都有 Intranet 和 Windows AD 登录。我们有许多内部 SQL Server 数据库,允许我们使用 Windows 身份验证登录,我正在尝试通过 ASP.NET Core 应用程序连接到其中一个数据库。我可以通过 SQL Server Management Studio 连接到该数据库并很好地查询表。
我已经按照教程进行了使用现有数据库的 ASP.NET Core 应用 https://learn.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db尽可能接近,并创建一个模型类来测试,看看我是否可以从数据库中读取数据。在 Visual Studio 中使用 IIS Express 进行调试时,我可以在访问自动生成的控制器和视图时从数据库读取数据。
调试时一切似乎都很好,但是当发布到 IIS 时,我收到以下错误:
SqlException: Login failed for user '<DOMAIN>\<COMPUTERNAME>$'.
其中domain是我的域,computername是我的计算机的名称。这是预期的,因为我的计算机本身无法访问数据库。但它不应该尝试使用该系统帐户(带有美元符号)进行连接,它应该尝试与我的 Windows 帐户连接:<DOMAIN>\<USERNAME>
.
更奇怪的是,这个应用程序does似乎以某种方式识别我的 Windows 凭据 - 当我访问主页时,我看到了熟悉的信息"Hello, <DOMAIN>\<USERNAME>!"
导航栏中的消息。因此,Windows 凭据肯定会传递到应用程序,但由于某种原因在尝试通过 DbContext 连接到数据库时没有传递。
我在这里遗漏了一些明显的东西吗?
My Code
我从 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"));
});
从那里,我使用实体框架搭建了一个带有视图的 MVC 控制器。
IIS 将 Windows 身份验证设置为“是”,将匿名身份验证设置为“否”。我的应用程序池通过 ApplicationPoolIdentity 设置为“无托管代码”。
编辑:问题
为了说明我试图解决的实际问题,我在远程 Intranet 服务器上有一个 SQL Server 数据库,该数据库允许通过 Windows 身份验证访问整个公司的子集。如果我想创建一个 ASP.NET 应用程序来向由 IIS 托管的数据库提供 API,那么最好的方法是什么?假设:
- 我不想自己管理权限或以某种方式复制它们
- 可以直接访问数据库的人应该可以访问 API,不能直接访问数据库的人则不能。
- 如果他们在登录 Windows 时从 Intranet 内访问它,则不必再次登录。
我以为我可以通过应用程序将他们的 Windows 凭据从 IIS 传递到 SQL Server,但我开始怀疑是否确实如此。