【发布时间】:2019-01-22 22:56:48
【问题描述】:
我在一家拥有 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"));
});
从那里,我使用实体框架搭建了一个带有视图的 MVC 控制器。
IIS 将 Windows 身份验证设置为 Yes,匿名身份验证设置为 No。我的应用程序池设置为 No Managed Code with ApplicationPoolIdentity。
编辑:问题
为了说明我要解决的实际问题,我在远程 Intranet 服务器上有一个 SQL Server 数据库,它允许通过 Windows 身份验证访问整个公司的子集。如果我想创建一个 ASP.NET 应用程序来为由 IIS 托管的该数据库提供 API,那么最好的方法是什么?假设:
- 我不想自己管理权限或以某种方式复制它们
- 直接访问数据库的人应该可以访问 API,不应该访问的人不应该。
- 如果他们在登录到 Windows 时从 Intranet 中访问它,则不必再次登录。
我以为我可以通过应用程序将他们的 Windows 凭据从 IIS 传递到 SQL Server,但我开始怀疑是否真的是这种情况。
【问题讨论】:
-
您将应用部署到哪里?您是否尝试过从您将应用程序部署到的机器连接到 sql server?那台机器上有 SSMS 吗?
-
我会删除“Trusted_Connection=True”设置,因为这是提供机器的凭据。我没有听说过从 IIS->ASP->SQL Server 传递的凭据。似乎您需要在某些时候提供一些凭据。
-
目前我正在将它部署到本地机器上的 IIS。我已经尝试过文件系统部署和 webdeploy。
-
您可以尝试使用 NetworkService 而不是 ApplicationPoolIdentity。如果这不起作用...设置一个数据库用户并提供凭据 - 就像一个健全性检查
-
我的理解是您的数据库连接将使用应用程序池标识(我猜默认为
\ $)。我相信你需要使用“模拟”来让它使用你登录的用户docs.microsoft.com/en-us/previous-versions/windows/it-pro/…
标签: asp.net sql-server iis asp.net-core windows-authentication