У меня есть веб-сайт, который пытается получить документы из папки, доступной только для определенных групп / пользователей 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 Process tab](https://i.stack.imgur.com/X0NpU.jpg)