2016-08-16 9 views
0

私は、MVC5アプリケーションのファイルダウンロードを、ログイン時に承認されたユーザーに提供しています。私はMVC5 Authorize FileダウンロードMVC5

App_Data/Files/{ItemName}/{FileName}.{FileExtension}次のように物理的なパス構造を使用する予定 (FileExtensionは、ほとんどの場合、郵便番号である)

資産

{**AssetId**, ItemName, FileName, FileExtension, FileLive} 

ApprovedToDownload

{**Id**, **userId**, **AssetId**, GUID, ExpireDate, StartDate} 

人が許可を取得したときuserIdは、上記のようにApprovedToDownloadテーブルと、ファイルへのアクセス用に作成された動的GUIDにリンクされています。 人は

/my-assets/download/GUID 

のようなURLを使用してファイルをダウンロードしますコントローラー

[Authorize] 
     [Route("my-assets/download/{id}",Name="mydload")] 
     [HttpGet] 
     public FileContentResult Download(Guid? id) 
     { 
      int userId = User.Identity.GetUserId<int>(); 
      if (id == null) { 
       throw new HttpException(404, "Not found"); 
      } 
      var fzip = db.ApprovedToDownloads.SingleOrDefault(a => a.GUID == id && a.UserId == userId && a.FileLive && a.ExpireDate <= DateTime.Today); 

      string fid = id.Value.ToString(); 
      string fldr=fzip.Asset.ItemName; 
      string fnom = fzip.Asset.FileName; 
      string fext = fzip.Asset.FileExtension; 
      // Read bytes from disk 
      byte[] fileBytes = System.IO.File.ReadAllBytes(Server.MapPath("~/App_Data/Files/"+fldr+"/"+fnom+"."+fext)); 

      return File(fileBytes, "application/zip", fid+"."+fext); 
      } 

セキュリティを考慮して、これを実装するための私の最高のオプションは何ですか?言い換えれば、私はこれに関する問題に直面し、ベストプラクティスの方向に私を向けることができるなら、誰にでもアドバイスできます。

答えて

0

ActionFiltersまたはRouteConstraintsは私が思うようなトリックを行います。