Доступ запрещен при вставке файла в Sql Server 2012 FileTable с помощью File.CreateFile на веб-сайте ASP.NET
У меня есть сайт ASP.NET. Я хочу загрузить файл на веб-сайт и сохранить его в FileTable в SqlServer 2012.
После загрузки код моего веб-сайта содержит объект Stream, который я хотел бы сохранить с помощью
System.IO.File.Create()
FileTable доступен в проводнике Windows, когда я иду в
\\ComputerName\FileStremShareName\FileStreamDirectoryName\FileTableName
Я могу вручную создавать файлы в этой папке с помощью проводника Windows. Я также могу использовать SQL для вставки файлов в таблицу файлов. В обоих случаях Windows Explorer и SQL Server показывают файлы, как и ожидалось.
Однако, если я попытаюсь использовать System.IO.File.CreateFile для создания файлов в пути, например
File.Create(\\\\ComputerName\FileStremShareName\FileStreamDirectoryName\FileTableName\myfile.jpg)
Я получаю сообщение "Доступ к пути" [путь]'запрещен "
Я предполагаю, что это потому, что у моего удостоверения пула приложений IIS нет доступа для чтения / записи в это местоположение.
Обычно я заходил в разрешения NTFS и назначал права на чтение / запись учетной записи Identity, но я не мог этого сделать, потому что основная папка скрыта от меня.
Я рассмотрел вопрос о преобразовании моего объекта Stream в байтовый массив и использовании SQL для вставки его в FileTable, но это кажется неэффективным, потому что мне сначала нужно преобразовать поток в байтовый массив, чтобы затем он был передан в SQL. Похоже, я анализирую данные моего файла дважды, чтобы сохранить его один раз.
Можно ли записать в таблицу файлов с помощью File.Create или аналогичного на веб-сайте ASP.NET. Если да, то как мне это сделать?
3 ответа
Это проблема с разрешениями. Однако разрешения предоставляются не через NTFS, а через SQL Server.
По умолчанию удостоверение пула приложений не имеет каких-либо разрешений для вашей базы данных, поэтому его необходимо изменить.
Добавьте имя входа в SQL Server для идентификатора пула приложений, который вы используете для своего веб-сайта. Например, "IIS APPPool\MyAppPool"
ИСПОЛЬЗОВАТЬ [мастер] ИДТИ СОЗДАТЬ ВХОД [IIS APPPOOL\myapppoolname] ИЗ WINDOWS WITH DEFAULT_DATABASE=[MyDatabase] ИДТИ
Добавьте пользователя в вашу базу данных, которую будет использовать этот логин
ИСПОЛЬЗОВАНИЕ [MyDatabase] СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ [MyUserName] ДЛЯ ВХОДА [IIS APPPool\myapppoolname]
Предоставьте пользователю соответствующие разрешения в вашей базе данных.
использовать [MyDatabase] GRANT INSERT TO [MyUserName] GRANT SELECT TO [MyUserName] ОБНОВЛЕНИЕ ГРАНТА ДО [MyUserName]
Я не уверен, является ли это полным набором необходимых разрешений, но я обнаружил, что мне достаточно сохранить новый файл.
Я была такая же проблема. Следующий ответ работает для меня.
- Создайте новую учетную запись на обоих серверах с тем же паролем.
- Настройте эту учетную запись для запуска приложения IIS
- Создайте имя входа в SQL Server для этой учетной записи с соответствующими правами.
Признанный ответ не работал для меня. Ответ в этой ссылке сделал.
Мой IIS-сервер находился не на том же сервере, что и база данных sql, поэтому я должен был убедиться, что пользователь пула приложений для IIS существует как пользователь windows на сервере sql, что у них был один и тот же пароль и что есть окна sql пользователь для учетной записи.