我有一个网站(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/,但未找到合适的解决方案。
我的问题是,
答案 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();
}
}