使用 ASP.NET 网站中的 File.CreateFile 将文件插入 Sql Server 2012 FileTable 时访问被拒绝

Posted

技术标签:

【中文标题】使用 ASP.NET 网站中的 File.CreateFile 将文件插入 Sql Server 2012 FileTable 时访问被拒绝【英文标题】:Access Denied when inserting file into Sql Server 2012 FileTable using File.CreateFile in ASP.NET website 【发布时间】:2014-07-24 06:59:56 【问题描述】:

我有一个 ASP.NET 网站。 我想将文件上传到网站并将其保存到 SqlServer 2012 中的 FileTable 中。

上传后,我的网站代码有一个我想保存的 Stream 对象

System.IO.File.Create()

当我转到时,可以在 Windows 资源管理器中访问 FileTable

\\ComputerName\FileStremShareName\FileStreamDirectoryName\FileTableName

我可以使用 Windows 资源管理器在此文件夹中手动创建文件。 我还可以使用 SQL 将文件插入到 File 表中。 在这两种情况下,Windows 资源管理器和 SQL Server 都会按预期显示文件。

但是,如果我尝试使用 System.IO.File.CreateFile 在路径中创建文件,例如

File.Create(\\\\ComputerName\FileStremShareName\FileStreamDirectoryName\FileTableName\myfile.jpg)

我收到消息“拒绝访问路径 '[path]'”

我认为这是因为我的 IIS 应用程序池标识无权读取/写入此位置。

通常,我会进入 NTFS 权限并为身份帐户分配读/写访问权限,但我无法执行此操作,因为底层文件夹对我隐藏。

我曾考虑将我的 Stream 对象转换为字节数组并使用 SQL 将其插入到 FileTable 中,但这似乎效率低下,因为我必须先将流转换为字节数组,然后才能将其传递给 SQL。这似乎我正在解析我的文件数据两次以保存一次。

是否可以在 ASP.NET 网站中使用 File.Create 或类似方法写入文件表。如果是这样,我该怎么做?

【问题讨论】:

【参考方案1】:

这是一个权限问题。但是,权限不是通过 NTFS 而是通过 SQL Server 授予的。

默认情况下,应用程序池标识对您的数据库没有任何权限,因此必须进行更改。

    为您的网站使用的应用程序池标识添加 SQL Server 登录名。例如。 "IIS APPPool\MyAppPool"

    使用 [主] 走 使用 DEFAULT_DATABASE=[MyDatabase] 从 WINDOWS 创建登录 [IIS APPPOOL\myapppoolname] 走

    在您的数据库中添加一个用户,此登录将使用该用户

    使用 [我的数据库] 为登录 [IIS APPPool\myapppoolname] 创建用户 [MyUserName]

    授予用户对您数据库的相关权限

    使用 [我的数据库] 授予插入 [MyUserName] 将选择授予 [MyUserName] 向 [MyUserName] 授予更新

我不确定这是否是所需的完整权限集,但我发现保存新文件就足够了。

【讨论】:

你好,保罗。自从您提供此答案以来已经有一段时间了,但是您知道在使用部分包含的数据库时这是否有效吗??? 不确定您所说的部分包含数据库是什么意思。 我在说这个docs.microsoft.com/en-us/sql/relational-databases/databases/… 我没有尝试过这种情况。我当时使用的是 SqlServer 2012。我认为这将取决于您在数据库或 Sql Server 实例中进行用户身份验证的位置。告诉我你过得怎么样? 好吧,为了通过 File API 保存文件(使用 sql server 管理的文件共享),我必须创建一个映射到 db 用户的全局登录。当我有时间时,我会尝试与本地用户一起使用 OpenSqlFilestream,看看它是否有效......【参考方案2】:

接受的答案对我不起作用。 this link 中的答案确实如此。

我的 IIS 服务器与 sql 数据库不在同一台服务器上,所以我必须确保 IIS 的应用程序池用户作为 sql 服务器上的 windows 用户存在,他们有相同的密码并且有该帐户的 sql windows 用户。

【讨论】:

【参考方案3】:

我有同样的问题。 following answer 适合我。

    在两台服务器上使用相同的密码创建一个新帐户。 配置该帐户以运行您的 IIS 应用程序 在 SQL Server 中为该帐户创建一个具有适当权限的登录。

【讨论】:

以上是关于使用 ASP.NET 网站中的 File.CreateFile 将文件插入 Sql Server 2012 FileTable 时访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

无法从 ASP.Net 网站项目中的代码访问 App_Code 中的类

无法调试在 Docker 中运行的 ASP.NET 网站中的启动代码

如何找到 ASP.Net 网站中的死锁

ASP.NET MVC 中的项目布局和站点结构

在运行 ASP.NET 的网站中,如何显示存储在 MS Access 2007 附件类型中的图像

asp.net中的浏览器控件?