c# - IIS 服务器上的 Entity Framework Core 和 Windows 身份验证
问题描述
我第一次尝试在我的 ASP.NET Core 3.1 MVC 站点上使用 Windows 身份验证来使用 EF Core 连接到 SQL Server。
本地一切正常(使用 IIS Express),但在服务器上,出现问题。
我的网站"hi,<myDomain/myAccount>!"
在页面的右上角,它是正确的,但是当我请求一个带有数据库查询的页面时,我收到了这个错误:
SqlException:用户“MyDomain\MyServerName$”登录失败
为什么?如何配置 EF Core 连接字符串?
更新:
- 我无法使用表单身份验证
- 我没有用户列表
- 我可以使用模拟(WinAuth?活动目录?)
- 每个用户(更多可以登录到站点的用户都可以访问 sql 数据库
- 我可以更改一些 IIS 服务器设置
- 这是我第一次使用 winAuth(由 Visual Studio 创建项目工具自动配置 => 使用 Windows 身份验证)
- “应用程序池在什么样的用户下运行?” 我不知道,我认为默认的
解决方案
这可能与在 IIS 中运行应用程序池的凭据以及这些特定凭据具有的访问权限有关。您说您没有使用模拟,在这种情况下,从您在 IIS 上运行的应用程序对 SQL Server 的请求需要使用具有适当数据库访问权限的系统帐户进行。系统帐户是一个单例帐户,仅作为 IIS 中应用程序的“应用程序池标识”而存在。
在您服务器上的 IIS 上,应用程序池在什么样的用户下运行?在大多数情况下,使用 Windows 身份验证时,您希望使用某种系统帐户来运行应用程序池,然后授予该系统帐户访问数据库的权限。如果您不想使用系统帐户,则必须使用模拟,然后使用 AD 组授予模拟用户访问 SQL Server 数据库的权限。
由于您说对 SQL Server 的请求以 DOMAIN\SERVERNAME 的形式出现,因此您可能需要在 IIS 中更改该设置以将请求设置为来自系统帐户,然后为该系统帐户提供对 SQL Server 的显式访问权限数据库。
您可以通过调整 IIS 中的高级设置并输入要在 IIS 中运行应用程序或“as”的帐户的信息(用户名/密码)来更改此设置。
然后,将这个相同的 DOMAIN\USERNAME 帐户添加到数据库作为可以读/写/删除等的用户。如果你不这样做,你也可以简单地将在它的请求中被拒绝的 DOMAIN\SERVERNAME 添加到数据库想使用自定义系统帐户。
至于“如何配置 EFCore 连接字符串?”,通常在 Startup.cs 文件中完成。.UseSqlServer(connectionstring)
在那里,您可以使用该方法直接从您的 appsettings.json 输入连接字符串。
您使用 访问连接字符串Configuration.GetConnectionString("KEY")
。
在那里配置后,您无需再次配置它(除非可能从 dev/qa/prod 环境更改)。