gpt4 book ai didi

c# - 使用 Entity Framework 在 ASP.NET Core 应用程序中对远程用户进行 Windows 身份验证

转载 作者:太空宇宙 更新时间:2023-11-03 14:47:35 25 4
gpt4 key购买 nike

背景

我有一个在 Http.sys 中运行的 ASP.NET Core 应用程序来提供 Windows 身份验证。

我的应用程序的客户端使用 Windows 身份验证,并且在用户首次访问该站点时会提示他们输入 Windows 登录凭据。一切都很好。

我正在使用由 Entity Framework 使用代码优先方法构建的 SQL Server 数据库(托管在与应用程序相同的服务器上)。在startup.cs文件我正在运行 dbContext.migrate()以确保数据库是最新的,然后应用程序继续正常运行。

问题

当远程用户与站点交互并执行需要访问数据库的操作时,我希望该数据库事务以他们的用户名执行。

例如,如果我在服务器上以 User1 运行 Asp.net 核心应用程序然后从登录为 User2 的用户计算机访问 webapp User1 仍在执行数据库交互因为这是运行主应用程序的用户。

我希望能够通过 User2 执行数据库交互而不是 User1在这种情况下。主要用于日志记录和分析。

检索 dbContext 的实例时我为它提供了一个连接字符串,声明使用 SSPI 进行身份验证。有没有办法将远程用户的用户名包含到此连接中,以便他们自己连接到数据库?我可以轻松地从我的 Controller 中检索远程用户的凭据/用户名。我相信我可以使用一种叫做 Impersonation 的东西但我不确定实现它的最佳实践,或者它是否是推荐的解决方案。

如有任何帮助,我们将不胜感激。

更新

感谢一些有用的反馈,我已尝试实现以下内容:

我的连接字符串在 startup.cs 中是这样设置的:

services.AddDbContext<MyDbContext>(options => options.UseSqlServer(@"Server=MyServer\MSSQLSERVER;Database=MyDatabase;Trusted_Connection=True;"));

然后我在我的 Controller /类中执行这样的操作:

        var values = new List<Values>();

WindowsIdentity.RunImpersonated(user.AccessToken, () =>
{
var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
optionsBuilder.UseSqlServer(@"Server=MyServer\MSSQLSERVER;Database=MyDatabase;Trusted_Connection=True;");

using (var ctx = new MyDbContext(optionsBuilder.Options))
{
values = (from row in ctx.Table select row).OrderBy(x => x.Id).ToList();
}
});

user变量被传递到函数中,类型为 WindowsIdentity .

从本地主机执行代码工作正常,但当远程用户尝试时返回以下错误:System.Data.SqlClient.SqlException: 'A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 0 - No such host is known.)

更新 2

我设法通过使用连接字符串的 IP 地址而不是服务器/机器名称来解决此错误。所以现在我的连接字符串如下所示: @"Server=<IP address>\MSSQLSERVER;Database=ConfigDb;Trusted_Connection=True

现在我面临另一个问题,SQL Server 声明 No connection could be made because the target machine actively refused it .我可以通过 SQL Management Studio 使用此用户连接到 SQL Server,但不能通过我的应用程序连接到 SQL Server。

我在 EventViewer 中发现实际错误与 SSPI 有关:SSPI handshake failed with error code 0x8009030c, state 14 while establishing a connection with integrated security; the connection has been closed. Reason: AcceptSecurityContext failed. The operating system error code indicates the cause of failure. The logon attempt failed [CLIENT: <named pipe>] .不太确定为什么会失败。

最佳答案

ASP.NET Core Docs涵盖这个确切的主题。

简单地说,ASP.NET Core 没有实现模拟。它有一个使用 WindowsIdentity 的变通方法示例,但它有其局限性,只能用于相对简单的操作。

还有一个NuGet package这可能会帮助您获得更多功能,但仍然是有限的。

关于c# - 使用 Entity Framework 在 ASP.NET Core 应用程序中对远程用户进行 Windows 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53524672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com