ASP.NET MVC - 表单身份验证会干扰视频播放

时间:2014-09-16 17:14:34

标签: asp.net-mvc asp.net-mvc-4 video forms-authentication

我需要能够支持"辅助" MVC(4)网站上的内容 - 图像,PDF,视频等。大部分内容由客户使用网站提供,因此未经身份验证的用户无法访问。

(我们正在使用表单身份验证来生成身份验证票证。请注意,我们必须使用内置成员身份/身份提供商,因为我们的一些客户希望使用身份验证通过其他方式,例如联合身份服务。)

我已通过设置网站来保护静态内容,以便按照here所述通过ASP.NET(通过runAllManagedModulesForAllRequests)路由/授权所有请求。
我发现我需要允许匿名访问ContentScripts文件夹(通过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。

非常感谢任何见解。

1 个答案:

答案 0 :(得分:0)

  

因此有效破坏了网站安全性

首先,该网站没有被破坏。虽然用户可以对其进行标记,但表单cookie将过期(取决于您在发布cookie时设置的令牌有效时间),并且链接将停止工作。

但是,请注意,您实际上不必将表单身份验证cookie值作为查询字符串中的标记传递。

例如,您可以生成一次性GUID类令牌,并且在第一次使用令牌时,它会在服务器端标记,不能再次使用。或者甚至您可以以某种方式加密或签署令牌中的令牌有效时间,以便链接在短时间内有效,但令牌在表单cookie上是独立的,但您不需要使用已使用令牌的辅助存储。 / p>