我有一个正在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)后,我们遇到了一些有关权限的问题(“访问被拒绝”):
我们有一个例外:
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用户下运行?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在您的场景中,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用户或组赋予必要的权限是解决问题的有效途径。