Mam działanie, które musi odczytać plik z bezpiecznej lokalizacji, więc muszę użyć personifikacji, aby odczytać plik.Podszywanie się w ASP.NET MVC
ten kod działa:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult DirectDownload(Guid id)
{
if (Impersonator.ImpersonateValidUser())
{
try
{
var path = "path to file";
if (!System.IO.File.Exists(path))
{
return View("filenotfound");
}
var bytes = System.IO.File.ReadAllBytes(path);
return File(bytes, "application/octet-stream", "FileName");
}
catch (Exception e)
{
Log.Exception(e);
}finally
{
Impersonator.UndoImpersonation();
}
}
return View("filenotfound");
}
Jedyny problem z powyższym kodzie jest to, że muszę przeczytać cały plik do pamięci i będę mieć do czynienia z bardzo dużymi plikami, więc nie jest to dobre rozwiązanie. Ale jeśli mam wymienić te 2 linie:
var bytes = System.IO.File.ReadAllBytes(path);
return File(bytes, "application/octet-stream", "FileName");
z tym:
return File(path, "application/octet-stream", "FileName");
to nie działa i pojawia się komunikat o błędzie:
dostęp do ścieżki „C: \ projects \ uploads \ 1 \ aa2bcbe7-ea99-499d-add8-c1fdac561b0e \ Untitled 2.csv 'jest zabronione.
Chyba wykorzystaniem wyników plik o ścieżce, próbuje otworzyć plik w późniejszym czasie na żądanie rurociągu, kiedy mam już „cofniętą” personifikacji.
Pamiętaj, że kod podszywania działa, ponieważ mogę odczytać plik z tablicy bajtów. Co chcę zrobić, to przesłać plik do klienta.
Masz pomysł, jak sobie z tym poradzić?
Z góry dziękuję.
To działało świetnie. Zmieniłem go trochę, ponieważ otrzymywałem wyjątek ... Impersonator.ImpersonateValidUser(); response.WriteFile (FileName); response.Flush(); response.End(); Impersonator.UndoImpersonation(); – Emad
Tak, to dobry początek.Jednak w niektórych wersjach usług IIS będą generowane błędy "Nieprawidłowy uchwyt", które są oparte na udostępnianiu pliku (a nie na podszywaniu się pod użytkownika). – Greg