2014-09-16 3 views
0

Мне нужно иметь возможность поддерживать «вспомогательный» контент на веб-сайте MVC (4) - изображения, PDF-файлы, видео и т. Д. Большая часть этого контента предоставлена клиент, использующий сайт, чтобы он не был доступен для пользователей, не прошедших проверку подлинности.ASP.NET MVC - Forms Аутентификация препятствует воспроизведению видео

(Мы используем проверку подлинность форм для создания билета аутентификации. Обратите внимание, что мы не обязательно используя встроенные членства/идентичность поставщиков, так как некоторые из наших клиентов хотят использовать проверку подлинности с помощью других средств, например, федеративных служба идентификации.)

Я получил статический контент, настроив сайт для маршрутизации/авторизации всех запросов через ASP.NET (через runAllManagedModulesForAllRequests), как описано here.
Я обнаружил, что мне нужно разрешить анонимный доступ к папкам Content и Scripts (через location) ... но эта конфигурация работает для большинства типов контента.

Он, однако, не работает для видеоконтента, в частности, в Internet Explorer. Media Player появляется, но сообщает, что он не может воспроизвести файл. «Возможно, плеер не поддерживает тип файла или кодировку, которая была использована для создания файла».
(Интересно, что в Chrome и Firefox нет ошибки. Видео воспроизводится на новой вкладке.)

Я вполне уверен, что это проблема Media Player. Если я добавлю элемент location и разрешу анонимный доступ к видео, он будет играть отлично. И у нас были аналогичные проблемы в прошлом, когда первопричина в конечном итоге оказалась связанной с безопасностью/аутентификацией.

Но, очевидно, я не могу изменить Media Player. И я должен поддерживать IE. Итак ... кто-нибудь знает, как можно обойти эту проблему программно в ASP.NET MVC? Любая помощь будет оценена по достоинству.


Я, кажется, помню, что видел сообщение SO о отправке данных аутентификации не только с HTTP-запросами. Я не могу найти этот пост сейчас. Но согласно Fiddler, запрос на самом деле является HTTP GET. И мы не отправляем заголовок аутентификации, но мы отправляем файл cookie для проверки подлинности.


Update:

Я думал, что я мог бы адаптировать ответ 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

поэтому безопасность сайта эффективно сломана

Прежде всего, сайт не нарушена. Хотя пользователь может пометить его, файл cookie будет истекать (в зависимости от времени действия маркера, установленного при выпуске файла cookie), и ссылка перестанет работать.

Но тогда обратите внимание, что вам действительно не нужно передавать значение cookie проверки подлинности форм как токен в строке запроса.

Вы можете, например, генерировать одноразовые GUID-подобные жетоны, и в первый раз, когда используется токен, он отмечен на стороне сервера и не может быть использован повторно. Или даже вы могли каким-то образом зашифровать или подписать время проверки токена в токене, чтобы ссылка была действительна в течение короткого периода времени, но токен не зависит от файла cookie форм, но вам не требуется вспомогательное хранилище используемых токенов.

+0

Это всего лишь сеанс cookie. Насколько я понимаю, они должны уйти, когда я закрываю все вкладки браузера (IE) или по истечении тайм-аута сеанса (30 минут). Это не то поведение, которое я вижу здесь. Даже после полного закрытия IE и/или ожидания более 30 минут, я все еще могу использовать ссылки. – David

+0

Это ** не ** сеансовый файл cookie, это файл cookie для проверки подлинности. Когда он истекает, зависит от того, как он создается. –

+0

Я имел в виду, что он не создается как постоянный файл cookie. Если я скопирую любой другой URL-адрес с сайта в буфер обмена, закройте и перезапустите IE и вставьте URL-адрес в адресную строку, я перенаправляюсь на страницу входа. Конечно, эти ссылки не включают cookie. – David