using System; using System.Collections.Generic; using System.Configuration; using System.Web; using CG67.FicheCollege.Domaine; using CG67.FicheCollege.Tools; using System.IO; using System.Security.Principal; namespace CG67.FicheCollege { /// /// Gestionnaire de téléchargement de fichier avec impersonification /// public class FileDownloadHandler : IHttpHandler { #region IHttpHandler Membres public bool IsReusable { get { return true; } } /// /// Traite la requête HTTP /// /// Le contexte HTTP public void ProcessRequest(HttpContext context) { // context.Response.Write("hello"); IntPtr token = IntPtr.Zero; WindowsImpersonationContext impersonatedUser = null; //On crée un jeton avec l'utilisateur devant accèder à la liste des fichiers bool result = Impersonation.LogonUser(ConfigurationManager.AppSettings["ImpersonationUser"], ConfigurationManager.AppSettings["ImpersonationDomain"], ConfigurationManager.AppSettings["ImpersonationPassword"], LogonSessionType.Interactive, LogonProvider.Default, out token); //Si le jeton est récupéré if (result) { //On récupère l'identité Windows WindowsIdentity id = new WindowsIdentity(token); //On change d'identité impersonatedUser = id.Impersonate(); //On construit le chemin et le FileInfo vers le fichier à télécharger // string filePath = Path.Combine(ConfigurationManager.AppSettings["FileRepository"], context.Request.QueryString["file"]); // string filePath = Path.Combine(ConfigurationManager.AppSettings["FileRepository"], context.Request.QueryString["file"]); // FileInfo file = new FileInfo(filePath); FileInfo file = new FileInfo(ConfigurationManager.AppSettings["FileRepository"] + context.Request.QueryString["file"]); //Si le fichier existe // if (File.Exists(filePath)) if (File.Exists(file.FullName)) { context.Response.ClearContent(); //Préparation des headers HTTP pour le téléchargement context.Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name); context.Response.AddHeader("Content-Length", file.Length.ToString()); string fileExtension = Path.GetExtension(file.Name).ToLower(); //On passe le bon Mime Type switch (fileExtension) { case "xls": context.Response.ContentType = "application/vnd.ms-excel"; break; case "xlsx": context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; break; default: break; } //On transmet le fichier pour téléchargement context.Response.TransmitFile(file.FullName); context.Response.End(); } } // Finalement on termine le changement d'identité if (impersonatedUser != null) impersonatedUser.Undo(); // On supprime le jeton if (token != IntPtr.Zero) Impersonation.CloseHandle(token); } #endregion } }