mercredi 12 février 2014

HttpHandler for File Security and Download

HttpHandler pour la Securité des fichiers et le télechargement

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Routing;
  6. namespace Security_HttpHandler
  7. {
  8.     public class DownloadHandler : IHttpHandler
  9.     {
  10.         #region action methods
  11.         /// <summary>
  12.         /// Enables processing of HTTP Web requests by a custom HttpHandler that implements the System.Web.IHttpHandler interface.
  13.         /// </summary>
  14.         /// <param name="context">An System.Web.HttpContext object</param>
  15.         public void ProcessRequest(HttpContext context)
  16.         {
  17.             context.Response.AddHeader("cache-control""must-revalidate");
  18.             //This is used to verify if user is connected
  19.             //if (!context.User.Identity.IsAuthenticated)
  20.             //{
  21.             //    context.Response.StatusCode = 403;
  22.             //    context.Response.StatusDescription = "Forbidden";
  23.             //    return;
  24.             //}
  25.             string file = context.Request.QueryString["file"];
  26.             if (string.IsNullOrWhiteSpace(file))
  27.             {
  28.                 context.Response.StatusCode = 400;
  29.                 context.Response.StatusDescription = "Bad Request";
  30.                 return;
  31.             }
  32.             string directory = context.Server.MapPath("~/App_Data/Docs/");
  33.             string fileName = System.IO.Path.Combine(directory, file);
  34.             if (!System.IO.File.Exists(fileName))
  35.             {
  36.                 context.Response.StatusCode = 404;
  37.                 context.Response.StatusDescription = "Not Found";
  38.                 return;
  39.             }
  40.             bool isAttachment;
  41.             string contentType = GetContentType(new System.IO.FileInfo(fileName).Extensionout isAttachment);
  42.             if (contentType == "NotAutorized")
  43.             {
  44.                 context.Response.StatusCode = 400;
  45.                 context.Response.StatusDescription = "This Contenttype not autorized";
  46.                 return;
  47.             }
  48.             context.Response.AppendHeader("content-disposition"string.Format("{0}filename={1}", isAttachment ?"attachment;" : "", EncodeFileNameForMimeHeader(file)));
  49.             context.Response.ContentType = contentType;
  50.             try
  51.             {
  52.                 context.Response.WriteFile(fileName);
  53.             }
  54.             finally
  55.             {
  56.                 context.Response.Flush();
  57.             }
  58.         }
  59.         /// <summary>
  60.         /// Gets a value indicating whether another request can use the System.Web.IHttpHandler instance.
  61.         /// </summary>
  62.         public bool IsReusable
  63.         {
  64.             get { return true; }
  65.         }
  66.         #endregion
  67.         #region private member functions
  68.         private static string EncodeFileNameForMimeHeader(string fileName)
  69.         {
  70.             var builder = new System.Text.StringBuilder(fileName.Length);
  71.             foreach (char ch in fileName)
  72.             {
  73.                 int num = Convert.ToInt32(ch);
  74.                 if ((((num >= 0x41) && (num <= 90)) || ((num >= 0x61) && (num <= 0x7a))) || (((num >= 0x30) &&(num <= 0x39)) || ((num == 0x20) || (num == 0x2e))))
  75.                 {
  76.                     builder.Append(ch);
  77.                 }
  78.                 else
  79.                 {
  80.                     char[] chars = new char[] { ch };
  81.                     foreach (byte num2 in System.Text.Encoding.UTF8.GetBytes(chars))
  82.                     {
  83.                         builder.Append("%");
  84.                         builder.Append(num2.ToString("X"System.Globalization.CultureInfo.InvariantCulture));
  85.                     }
  86.                 }
  87.             }
  88.             return builder.ToString();
  89.         }
  90.         private static string GetContentType(string Extension, out bool isAttachment)
  91.         {
  92.             isAttachment = true;
  93.             switch (Extension.ToLowerInvariant())
  94.             {
  95.                 case ".txt":
  96.                     isAttachment = false;
  97.                     return "text/plain";
  98.                 case ".doc":
  99.                 case ".dot":
  100.                     return "application/msword";
  101.                 case ".docx":
  102.                     return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
  103.                 case ".dotx":
  104.                     return "application/vnd.openxmlformats-officedocument.wordprocessingml.template";
  105.                 case ".xls":
  106.                 case ".xlt":
  107.                     return "application/vnd.ms-excel";
  108.                 case ".xlsx":
  109.                     return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
  110.                 case ".xltx":
  111.                     return "application/vnd.openxmlformats-officedocument.spreadsheetml.template";
  112.                 case ".ppt":
  113.                     return "application/vnd.ms-powerpoint";
  114.                 case ".pptx":
  115.                     return "application/vnd.openxmlformats-officedocument.presentationml.presentation";
  116.                 case ".pdf":
  117.                     return "application/pdf";
  118.             }
  119.             return "NotAutorized";
  120.         }
  121.         #endregion
  122.     }
  123. }


Aucun commentaire:

Enregistrer un commentaire