Использовать безопасность NTFS в IIS для данного пользователя - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть веб-сайт, который пытается получить документы из папки, доступной только для определенных групп / пользователей AD.Учитывая пользователя, который аутентифицирован с использованием аутентификации Windows, я хочу попытаться проверить, есть ли у него доступ к определенному местоположению, и отобразить / скрыть документы по мере необходимости.У меня сложилось впечатление, что при использовании Windows Authentication и ASP.NET Impersonation при выполнении запроса будут использоваться учетные данные текущего пользователя, а не учетные данные пула приложений, но, похоже, это не так, потому что я администратор, способныйоткрывать ограниченные папки в проводнике Windows, но я не могу прочитать их из своего приложения.

Можно ли использовать текущие запрашивающие учетные данные пользователя для доступа к файлам в локальной файловой системе?

В моем web.config:

<appSettings>
    <add key="documentFolder" value="C:\Users\auser\source\repos\myapp\myapp\docs\folder1,C:\Users\auser\source\repos\myapp\myapp\docs\folder2,C:\Users\auser\source\repos\myapp\myapp\docs\secured" />
    <add key="securityFolder" value="C:\Users\auser\source\repos\myapp\myapp\docs\secured"/>
</appSettings>
<system.web>
  <authentication mode="Windows" />
  <identity impersonate="true"/>
  <authorization>
    <deny users="?" />
  </authorization>
</system.web>

Я пытаюсь получить доступ к файлам в двух местах.Сначала я индексирую их (на данный момент это выполняется из Application_Start):

var dirs = ConfigurationManager.AppSettings["documentFolder"].ToString().Split(',');

foreach (var dir in dirs)
{
    foreach (var file in Directory.GetFiles(dir, "*.pdf", SearchOption.TopDirectoryOnly))
    {
        try
        {
            FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read); // <-- Fails with "Access to the path 'C:\Users\auser\source\repos\myapp\myapp\docs\secured' is denied."
        }
        catch (Exception ex)
        {
            logger.Error("Failed to read file.", ex);
        }
    }
}

Позже я пытаюсь проверить, есть ли у пользователя доступ:

protected void Button1_Click(object sender, EventArgs e)
{
    bool canSeeSecurityDocuments;
    try
    {
        System.Security.AccessControl.DirectorySecurity ds = Directory.GetAccessControl(ConfigurationManager.AppSettings["securityFolder"].ToString()); <-- Fails with "Attempted to perform an unauthorized operation."
        canSeeSecurityDocuments = true;
    }
    catch (Exception ex)
    {
        canSeeSecurityDocuments = false;
    }
}

Из procmon:

Требуемый доступ: чтение атрибутов, управление чтением

Расположение: открыто

Параметры: Открыть точку повторной обработки

Атрибуты: н / п

ShareMode: чтение, запись, удаление

AllocationSize: n / a

Олицетворение: mydomain \ myuserid <- отредактировано, но верно. </p>

На основе выключеноИсследуя интегрированные и классические конвейеры, я переместил вызов GetFiles в другое место и обернул его в WindowsImpersonationContext, чтобы посмотреть, не вызовет ли это имперсонацию, чего не произошло.(От этого SO ответа ):

var current = System.Security.Principal.WindowsIdentity.GetCurrent();
logger.Debug(current.Name); <-- This is my identity

WindowsIdentity clientId = (WindowsIdentity)User.Identity;

using (WindowsImpersonationContext wic = clientId.Impersonate())
{
    current = System.Security.Principal.WindowsIdentity.GetCurrent();
    logger.Debug(current.Name); <-- This is still my identity

    // call to GetFiles, as above. Still fails.
}

current = System.Security.Principal.WindowsIdentity.GetCurrent();
logger.Debug(current.Name); <-- still me. Nothing seems to change.

Procmon Event tab Procmon Process tab

1 Ответ

0 голосов
/ 12 апреля 2019

Проблема заключалась в том, что я использовал пул потоков для выполнения некоторой фоновой работы (индексация файлов)., согласно этому ответу SO , кажется, что пул потоков не переносит учетные данные, которые использовались для его создания.Я должен был проверить в фактическом потоке, чтобы увидеть, что контекст был ...

...