Доступ запрещен при вставке файла в 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.

По умолчанию удостоверение пула приложений не имеет каких-либо разрешений для вашей базы данных, поэтому его необходимо изменить.

  1. Добавьте имя входа в SQL Server для идентификатора пула приложений, который вы используете для своего веб-сайта. Например, "IIS APPPool\MyAppPool"

    ИСПОЛЬЗОВАТЬ [мастер]
    ИДТИ
    СОЗДАТЬ ВХОД [IIS APPPOOL\myapppoolname] ИЗ WINDOWS WITH DEFAULT_DATABASE=[MyDatabase]
    ИДТИ
  2. Добавьте пользователя в вашу базу данных, которую будет использовать этот логин

    ИСПОЛЬЗОВАНИЕ [MyDatabase]
    СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ [MyUserName] ДЛЯ ВХОДА [IIS APPPool\myapppoolname]
  3. Предоставьте пользователю соответствующие разрешения в вашей базе данных.

    использовать [MyDatabase]
    GRANT INSERT TO [MyUserName]
    GRANT SELECT TO [MyUserName]
    ОБНОВЛЕНИЕ ГРАНТА ДО [MyUserName]

Я не уверен, является ли это полным набором необходимых разрешений, но я обнаружил, что мне достаточно сохранить новый файл.

Я была такая же проблема. Следующий ответ работает для меня.

  1. Создайте новую учетную запись на обоих серверах с тем же паролем.
  2. Настройте эту учетную запись для запуска приложения IIS
  3. Создайте имя входа в SQL Server для этой учетной записи с соответствующими правами.

Признанный ответ не работал для меня. Ответ в этой ссылке сделал.

Мой IIS-сервер находился не на том же сервере, что и база данных sql, поэтому я должен был убедиться, что пользователь пула приложений для IIS существует как пользователь windows на сервере sql, что у них был один и тот же пароль и что есть окна sql пользователь для учетной записи.

Другие вопросы по тегам