Доступ к каталогу с текущим авторизованным пользователем

У меня есть веб-сайт, на котором используется проверка подлинности Windows, которая вызывает API. У API есть атрибут Authorize:

[Authorize(Roles = @"myrole.local\role")] 

Затем API вызывает метод на моем бизнес-уровне, который делает следующее:

string [] directories = Directory.GetDirectories("\\\\server\\folder\\folder2");

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

Теперь, когда я развертываю свой веб-сайт в нашей среде разработки, он больше не работает (мы получаем ошибку «Доступ запрещен» для этой папки). Мы изучили это и обнаружили, что user, пытающийся получить доступ к папке, был нашим сервером (что-то вроде server$), попытался получить доступ к папке и потерпел неудачу.

Итак, мой вопрос: как мне получить доступ к папке с текущим пользователем, который вошел в систему? Я просмотрел это здесь, в Stack Overflow, и вижу, что часто возникает подражание. Я безуспешно пробовал этот пример:

public static List<DirectoryName> GetDirectories(IPrincipal user)
{
    string[] directories;
    using (WindowsImpersonationContext impersonationContext = ((WindowsIdentity)user.Identity).Impersonate())
    {
        //Insert your code that runs under the security context of the authenticating user here.
        directories = Directory.GetDirectories("\\\\server\\folder\\");
    }
}

Мне все еще отказано в доступе.

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

Кто-нибудь знает, как это обойти? Я что-то упускаю?

P.S. Я создал веб-сайт с IIS и настроил как API, так и веб-сайт для использования проверки подлинности Windows. (anon = false;); но все же он говорит, что сервер пытается получить доступ к папке.

P.P.S. В web.config для API у меня тоже есть эти теги:

<system.web>
  <!-- ... -->
  <authentication mode="Windows"/>
  <authorization>
    <allow roles="group.local\group" />
  </authorization>
</system.web>

Изменить: Таким образом, мы смогли получить доступ к пути к папке с вошедшим в систему пользователем, но только при переходе на веб-сайт на сервере.

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

Надеюсь, эта редакция дает больше информации.


person jtslugmaster08    schedule 12.03.2019    source источник
comment
Взгляните на этот вопрос, чтобы узнать, решит ли он вашу проблему: stackoverflow.com/questions/1405612/   -  person Mohammad    schedule 12.03.2019
comment
Должен ли иметь доступ к каталогу принципал пользователя? Не могли бы вы просто разрешить учетным данным вашего приложения доступ к каталогу?   -  person alans    schedule 12.03.2019
comment
@alans да, это должен быть принципал пользователя по причинам аудита.   -  person jtslugmaster08    schedule 12.03.2019
comment
Это связано с тем, что когда вы работаете локально, он использует вашу учетную запись пользователя, при работе на сервере он будет использовать учетную запись пула приложений. Вам придется разрешить выдачу себя за другое лицо, если вы хотите, чтобы это работало без взлома ... см. Комментарий @ Neptune   -  person mxmissile    schedule 12.03.2019
comment
@Neptune, к сожалению, я внес изменения, чтобы включить делегирование, но все же аудит говорит, что сервер пытается получить доступ к папке. Не следует ли мне использовать оператор using?   -  person jtslugmaster08    schedule 13.03.2019
comment
Что происходит, когда вы разрешаете выдавать себя за другое лицо? <authentication mode="Windows"> <identity impersonate="true" /> </authentication>. Не думайте, что это сработает с кодом делегирования.   -  person mxmissile    schedule 19.03.2019
comment
@mxmissile Выдает ошибку во время выполнения, говоря, что я не могу impersonate = true с интегрированным конвейером. Я считаю, что мне нужен интегрированный конвейер с моей текущей настройкой. сайт угловатый. спокойный api с post, put и get звонки использует .net4.7.2, и я пытаюсь использовать Windows auth. Я не мог заставить классический конвейер работать с CORS. если вы не укажете мне правильное направление. Я весь внимание.   -  person jtslugmaster08    schedule 19.03.2019
comment
У меня была такая же ситуация, я использовал это в прошлом, это немного глючно и хакерское, и после себя плохо очищается, но ... gist.github.com/mxmissile/8f2ef5ed3f5687e9053f   -  person mxmissile    schedule 19.03.2019
comment
@mxmissile Я попробую. Хотя в качестве параметров у вас есть пользователь, пароль, домен. но я не знаю, как получить пароль от IPrincipal или от вошедшего в систему пользователя. Ты знаешь как?   -  person jtslugmaster08    schedule 19.03.2019
comment
Нет, вы не сможете этого сделать, вам придется сохранять пароль при входе в систему или что-то в этом роде. Как я уже сказал, крайне хакерский и недействительный ответ (отсюда и комментарий). Я никогда не использовал его для олицетворения вошедшего в систему пользователя, мне приходилось олицетворять конкретную учетную запись, чтобы учетные данные могли быть жестко закодированы.   -  person mxmissile    schedule 19.03.2019
comment
@mxmissile, так что это помогло. Я думаю, было бы неплохо иметь олицетворение работы с объектом IPrinciple, но поскольку это не является родным для Microsoft, ваше решение / взлом работает для меня. Я попрошу специалиста по эксплуатации создать учетную запись пользователя исключительно для нашего веб-сайта, и мне придется вручную регистрировать или проверять, кто использует этот веб-сайт.   -  person jtslugmaster08    schedule 19.03.2019
comment
Если вы хотите создать учетную запись пользователя только для этого, почему бы просто не настроить ApplicationPool для использования указанной учетной записи? Никаких хитростей с этим.   -  person mxmissile    schedule 19.03.2019