验证对文件夹 C# MVC 中文件的 GET 请求
Authenticate GET requests to files in a folder C# MVC
我有一个网站(IIS、C#.Net、MVC4),其中用户经过(表单)身份验证,他们上传媒体文件(主要是 .mp4)并授权一组用户按需播放。我将这些文件存储在本地存储中。
我使用 jwplayer 将这些文件播放回授权用户点播。
jwplayer 希望我直接传递 url 让它播放,但我不想暴露直接的 url.
我真的必须限制对这些文件的未授权访问,因为它们是私人文件。
我尝试实现一个控制器方法来处理 https://mysite/Video/Watch?VideoId=xyz 和 return 实际文件的 FileStream。它直接在浏览器上运行。 (虽然不确定它对大文件的效率如何。)
但问题是,jwplayer 寻找 urls 模式 http(s)://domain/path/file.mp4[?parameter1=value1¶meter2=value2 等等。]
当我给出一个 url 像 https://mysite/Video/Watch?VideoId=xyz 时,它说 'No playable sources found' 甚至没有发送 HEAD 请求。
如果我直接公开 url 文件,任何人都可以下载这些文件,这将破坏隐私。
最坏的情况,我至少要避免永远存在的热链接。
我也看过 www.jwplayer.com/blog/securing-your-content/ 但没有找到合适的解决方案。
我的问题是,
- 有什么方法可以保留 url http(s)://domain/path/file.mp4 的模式并仍然控制对文件的访问?
- 如果 (1.) 不可能,我如何利用可以在 url 上传递的参数。有了参数,我可以想到有符号的urls。如果我必须提供并且handle/validate签署urls.
,我应该在服务器上做什么
- 只是为了不影响性能,在任何验证之后,我能否以某种方式让 iis 来处理文件流而不是我的代码?
我实现了一个 HTTPModule 来 allow/block 访问文件。这解决了我的问题 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();
}
}
我有一个网站(IIS、C#.Net、MVC4),其中用户经过(表单)身份验证,他们上传媒体文件(主要是 .mp4)并授权一组用户按需播放。我将这些文件存储在本地存储中。
我使用 jwplayer 将这些文件播放回授权用户点播。
jwplayer 希望我直接传递 url 让它播放,但我不想暴露直接的 url.
我真的必须限制对这些文件的未授权访问,因为它们是私人文件。
我尝试实现一个控制器方法来处理 https://mysite/Video/Watch?VideoId=xyz 和 return 实际文件的 FileStream。它直接在浏览器上运行。 (虽然不确定它对大文件的效率如何。)
但问题是,jwplayer 寻找 urls 模式 http(s)://domain/path/file.mp4[?parameter1=value1¶meter2=value2 等等。]
当我给出一个 url 像 https://mysite/Video/Watch?VideoId=xyz 时,它说 'No playable sources found' 甚至没有发送 HEAD 请求。
如果我直接公开 url 文件,任何人都可以下载这些文件,这将破坏隐私。
最坏的情况,我至少要避免永远存在的热链接。
我也看过 www.jwplayer.com/blog/securing-your-content/ 但没有找到合适的解决方案。
我的问题是,
- 有什么方法可以保留 url http(s)://domain/path/file.mp4 的模式并仍然控制对文件的访问?
- 如果 (1.) 不可能,我如何利用可以在 url 上传递的参数。有了参数,我可以想到有符号的urls。如果我必须提供并且handle/validate签署urls. ,我应该在服务器上做什么
- 只是为了不影响性能,在任何验证之后,我能否以某种方式让 iis 来处理文件流而不是我的代码?
我实现了一个 HTTPModule 来 allow/block 访问文件。这解决了我的问题 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();
}
}