验证对文件夹C#MVC中的文件的GET请求

时间:2015-08-24 11:54:18

标签: c# asp.net-mvc jwplayer

我有一个网站(IIS,C#.Net,MVC4),其中用户(表单)经过身份验证,他们上传媒体文件(主要是.mp4)并授权用户按需播放。我将这些文件存储在本地存储中。

我根据需要使用jwplayer将这些文件播放回授权用户。 jwplayer希望我直接传递url来播放,但我不想公开直接网址。
我真的必须限制对这些文件的未授权访问,因为它们是私有文件。

我尝试实现一个控制器方法来处理https://mysite/Video/Watch?VideoId=xyz,并返回实际文件的FileStream。它直接在浏览器上运行。 (虽然不确定大文件的效率如何。)

但问题是,jwplayer查找模式http(s)的网址://domain/path/file.mp4 [?parameter1 = value1& parameter2 = value2等等。)
当我提供类似https://mysite/Video/Watch?VideoId=xyz的网址时,它会说“找不到可播放的来源”。甚至没有发送HEAD请求。

如果我直接公开网址,这些文件可供任何人下载,这将破坏隐私 最糟糕的情况是,我至少希望避免永久存在的热门链接。

我也查看了www.jwplayer.com/blog/securing-your-content/,但未找到合适的解决方案。

我的问题是,

  1. 有没有办法可以保留url http(s)的模式://domain/path/file.mp4并仍然可以控制对该文件的访问?
  2. 如果(1。)不可用,我如何利用可以在网址上传递的参数。有了参数,我可以想到签名的网址。如果我必须提供并处理/验证签名的网址,我该怎么办?
  3. 只是不妨碍性能,经过任何验证后,我能以某种方式让iis处理文件流而不是我的代码吗?

1 个答案:

答案 0 :(得分:1)

我实现了一个HTTPModule来允许/阻止访问该文件。这解决了我的问题1& 3。 下面的代码段。

    void context_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        HttpApplication app = sender as HttpApplication;

        //Get the file extension
        string fileExt= Path.GetExtension(app.Request.Url.AbsolutePath);

        //Check if the extension is mp4
        bool requestForMP4 = fileExt.Equals(".mp4", StringComparison.InvariantCultureIgnoreCase);

        //If the request is not for an mp4 file, we have nothing to do here
        if (!requestForMP4)
            return;

        //Initially assume no access to media 
        bool allowAccessToMedia = false;

        //....
        // Logic to determine access
        // If allowed set allowAccessToMedia = true
        // otherwise, just return
        //....

        if(!allowAccessToMedia)
        {
            //Terminate the request with HTTP StatusCode 403.2 Forbidden: Read Access Forbidden
            app.Response.StatusCode = (int)HttpStatusCode.Forbidden;
            app.Response.SubStatusCode = 2;
            app.CompleteRequest();
        }
    }