我需要能够支持"辅助" MVC(4)网站上的内容 - 图像,PDF,视频等。大部分内容由客户使用网站提供,因此未经身份验证的用户无法访问。
(我们正在使用表单身份验证来生成身份验证票证。请注意,我们不必须使用内置成员身份/身份提供商,因为我们的一些客户希望使用身份验证通过其他方式,例如联合身份服务。)
我已通过设置网站来保护静态内容,以便按照here所述通过ASP.NET(通过runAllManagedModulesForAllRequests
)路由/授权所有请求。
我发现我需要允许匿名访问Content
和Scripts
文件夹(通过location
)...但此配置适用于大多数内容类型。
但它不适用于视频内容,特别是在Internet Explorer中。媒体播放器出现但报告说它无法播放该文件。 "播放器可能不支持用于创建文件的文件类型或编码。"
(有趣的是,Chrome或Firefox中没有错误。视频在新标签中播放。)
我相当确定它是媒体播放器的问题。如果我添加location
元素并允许匿名访问视频,它就可以正常播放。我们过去也遇到过类似的问题,根本原因最终导致与安全/身份验证相关。
但显然我无法改变媒体播放器。我必须支持IE。那么......有没有人知道在ASP.NET MVC中以编程方式解决这个问题的方法?任何帮助将不胜感激。
我似乎记得看到有关发送身份验证信息的SO帖子,而不仅仅是HTTP请求。我现在无法找到该帖子。但根据Fiddler的说法,请求实际上是HTTP GET。我们并没有发送身份验证标头,但我们正在发送身份验证Cookie。
更新
我以为我能够将答案调整为this question
它涉及将标志和授权cookie值附加到内容URL,并挂钩到Application_BeginRequest
事件。
在视图中:
var asset = ...;
var authToken = Request.Cookies[FormsAuthentication.FormsCookieName].Value;
var assetUri = string.Format("~/Media/{0}?requireAuthSync=true&token={1}",
asset.ID, Url.Encode(authToken));
然后在Global.asax.cs
:
protected void Application_BeginRequest()
{
if (!string.IsNullOrEmpty(Context.Request["requireAuthSync"]))
{
AuthCookieSync();
}
}
private void AuthCookieSync()
{
var authParamName = "token";
var authCookieName = FormsAuthentication.FormsCookieName;
try
{
if (!string.IsNullOrEmpty(Context.Request[authParamName]))
{
var authCookieValue = Context.Request.QueryString[authParamName];
var authCookie = Context.Request.Cookies.Get(authCookieName)
?? new HttpCookie(authCookieName);
authCookie.Value = authCookieValue;
Context.Request.Cookies.Set(authCookie);
}
}
catch
{
}
}
使用这种方法,视频确实可以在IE中播放 但是,现在可以将视频(或其他内容)加入书签并使用书签访问内容而无需进行身份验证...因此有效地破坏了网站安全性。
所以看来,为了保护网站安全,我不应该创建cookie,如果它还没有存在的话。但是使用Media Player,创建cookie是让视频播放的唯一方法。我似乎陷入了Catch-22。
非常感谢任何见解。
答案 0 :(得分:0)
因此有效破坏了网站安全性
首先,该网站没有被破坏。虽然用户可以对其进行标记,但表单cookie将过期(取决于您在发布cookie时设置的令牌有效时间),并且链接将停止工作。
但是,请注意,您实际上不必将表单身份验证cookie值作为查询字符串中的标记传递。
例如,您可以生成一次性GUID类令牌,并且在第一次使用令牌时,它会在服务器端标记,不能再次使用。或者甚至您可以以某种方式加密或签署令牌中的令牌有效时间,以便链接在短时间内有效,但令牌在表单cookie上是独立的,但您不需要使用已使用令牌的辅助存储。 / p>