开发者社区 问答 正文

.NET核心实体框架让用户运行存储过程

我有一个正在Windows身份验证下运行的ASP.NET Core Web API。我有使用连接字符串语法处理数据库的实体框架: "data source=dbserver; initial catalog=IntranetDB; persist security info=True; Integrated Security=SSPI;"

我的Web API在特定的应用程序池和服务帐户下运行sa_db。

这sa_db是数据库的所有者并已bulk load启用。

API中的一个过程是将.csv文件保存到网络共享,然后调用SP来打开该文件并对其进行处理。 问题 在进行一些更改(例如将以下内容添加到SP)后,我们遇到了一些有关权限的问题(“访问被拒绝”):

}1NDU9`34OE(K%9N9SD{FPS.png

我们有一个例外:

System.Data.SqlClient.SqlException (0x80131904): You do not have permission to use the bulk load statement. 但是sa_db启用了此功能。

当我们使用API​​将bulk load启用了API的AD用户的安全组添加到SQL数据库时,一切正常。

在SQL的活动监视器中,我只能看到该sa_db帐户。

为什么SP使用AD而不是服务帐户在AD用户下运行?

展开
收起
游客syccbxcrjoo2g 2019-11-29 14:55:04 873 分享 版权
阿里云 AI 助理回答

在您的场景中,ASP.NET Core Web API 应用程序使用 Windows 身份验证连接到 SQL Server 数据库,并且您提到 SP(存储过程)在执行时遇到了权限问题,特别是与 BULK INSERT 操作相关的。尽管数据库所有者 sa_db 已经启用了 BULK ADMIN 权限,但问题依然存在。

这里的关键在于理解 SQL Server 如何处理执行上下文,尤其是在涉及到集成安全性和特定操作(如 BULK INSERT)时。BULK INSERT 是一个需要特殊权限的操作,它通常会依据执行该命令的用户的安全上下文来决定是否允许执行。

当您从 ASP.NET Core Web API 调用存储过程时,虽然应用程序池和服务帐户是 sa_db,但是 SQL Server 在执行 BULK INSERT 时可能会切换到调用它的连接的安全上下文。这意味着,即使连接是由具有足够权限的服务帐户建立的,如果存储过程内部执行的操作(如 BULK INSERT)依赖于调用者的具体权限,那么它将遵循客户端(即Web API运行的身份)的权限设置。

解决此问题的方法之一,正如您所发现的,是在SQL Server数据库级别为执行API的AD用户或其所属的安全组授予相应的权限。这确保了当存储过程尝试执行 BULK INSERT 时,该操作能够基于调用者的身份正确地进行权限检查并成功执行。

总结来说,尽管数据库连接使用了服务账户 sa_db,但在执行特定操作(如 BULK INSERT)时,SQL Server 可能会根据实际执行请求的用户的安全上下文来确定权限,而不是仅仅依赖于连接账户。因此,直接给执行API的AD用户或组赋予必要的权限是解决问题的有效途径。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答