2013-11-28 6 views
0

crosspost: https://orchard.codeplex.com/discussions/471384Возвращение файла в месте с проверкой подлинности

Я использую Orchard CMS 1.7 и мы заперли весь сайт от анонимных пользователей (администратора -> Пользователи -> ролей -> снимите галочку с сайта фронтальными). Теперь, каждая страница или файл требует, чтобы люди были аутентифицированы, прежде чем получать к ним доступ.

Теперь мы пытаемся предоставить возможность загрузки некоторых файлов для загрузки в зависимости от поля из определенного типа содержимого.

Этот вопрос

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

Это фактический код возврата файла (redirectLink является путь_к_файлом):

    var cd = new System.Net.Mime.ContentDisposition 
        { 
         FileName = fileName, 
         Inline = false 
        }; 

        Response.AppendHeader("Content-Disposition", cd.ToString()); 
        return File(HttpUtility.UrlDecode(redirectLink), mimeType); 

Вот мой полный код (Действие контроллера):

 [AlwaysAccessible] 
     public ActionResult Download(int resourceId) 
     { 
      //set default unsecure value to false 
      bool isUnsecured = false; 

      var resourceItem = ContentManager.Get(resourceId); 
      if (resourceItem == null || resourceItem.ContentType != "Resource") 
      { 
       // TODO: log that ID not found?? 
       return new HttpStatusCodeResult(HttpStatusCode.NotFound); 
      } 

      var resourcePart = resourceItem.Parts.FirstOrDefault(p => p.PartDefinition.Name == resourceItem.ContentType); 

      //retrieve unsecure boolean 
      if (resourcePart != null) 
      { 
       var unsecuredField = resourcePart.Fields.FirstOrDefault(f => f.Name == "Unsecured"); 
       if (unsecuredField != null) 
       { 
        isUnsecured = unsecuredField.Storage.Get<bool>(); 
       } 
      } 

      //check if unsecured resource/allow anonymous downloads 
      //see Orchard.Security.SecurityFilter - I'm not sure where this is actually used in Orchard though... 
      if (!isUnsecured && !Services.Authorizer.Authorize(StandardPermissions.AccessFrontEnd, T("Unauthenticated"))) 
      { 
       return new HttpUnauthorizedResult(); 
      }          

      if (resourcePart != null) 
      { 
       // TODO: Potential concurrency issues? 
       var downloadCountPart = resourcePart.As<DownloadCountPart>(); 
       if (downloadCountPart != null) 
       { 
        downloadCountPart.Total++; 
        ContentManager.Publish(resourceItem); 
       } 

       // Do the redirection/serving of item! 
       // Prioritize link field over resource field, according to the UI 
       var linkedField = resourcePart.Fields.FirstOrDefault(f => f.Name == "LinkedFile"); 
       if (linkedField != null) 
       { 
        var redirectLink = linkedField.Storage.Get<string>(); 
        if (redirectLink != null) 
        { 
         return Redirect(redirectLink); 
        } 
       } 

       var resourceField = resourcePart.Fields.First(f => f.Name == "ResourceFile"); 
       if (resourceField != null) 
       { 
        var resourceMPF = (resourceField as MediaLibraryPickerField);  

        if (resourceMPF != null && resourceMPF.MediaParts != null && resourceMPF.MediaParts.Count() > 0) 
        { 
         var fileName = resourceMPF.MediaParts.First().FileName; 
         var mimeType = resourceMPF.MediaParts.First().MimeType; 
         var redirectLink = resourceMPF.MediaParts.First().MediaUrl;  //to check: first? when are there multiple? 
         if(!string.IsNullOrWhiteSpace(redirectLink)) 
         { 

          var cd = new System.Net.Mime.ContentDisposition 
          { 
           FileName = fileName, 
           Inline = false 
          }; 

          Response.AppendHeader("Content-Disposition", cd.ToString()); 
          return File(HttpUtility.UrlDecode(redirectLink), mimeType); 
         } 

        }     
       } 
      } 

      return new HttpStatusCodeResult(HttpStatusCode.NotFound); 
     } 

Что приводит меня к этим вопросам :

  1. Событие с возвратом Файл, он по-прежнему принимает во внимание текущего пользователя и проверяется ли это лицо?
  2. Могу ли я использовать олицетворение, чтобы обойти эту проблему?

Любой совет или информация будут высоко оценены. Благодаря!

ответ

1

Причина, по которой вы получаете пустой файл, связана с ошибкой в ​​модуле выходного кэша, который активен только для анонимных пользователей. Эта ошибка исправлена ​​в Orchard 1.7.2, поэтому обновление поможет.

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

+0

Работала безупречно, хотя она и не сразу отражалась. Я продолжал удалять cache.dat и другие вещи в App_Data, просто убедитесь. Благодаря! – AnimaSola

+0

Рад слышать :-). – Piedone

Смежные вопросы