Мне нужно иметь возможность поддерживать «вспомогательный» контент на веб-сайте 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.
Любое понимание было бы высоко оценено.
Это всего лишь сеанс cookie. Насколько я понимаю, они должны уйти, когда я закрываю все вкладки браузера (IE) или по истечении тайм-аута сеанса (30 минут). Это не то поведение, которое я вижу здесь. Даже после полного закрытия IE и/или ожидания более 30 минут, я все еще могу использовать ссылки. – David
Это ** не ** сеансовый файл cookie, это файл cookie для проверки подлинности. Когда он истекает, зависит от того, как он создается. –
Я имел в виду, что он не создается как постоянный файл cookie. Если я скопирую любой другой URL-адрес с сайта в буфер обмена, закройте и перезапустите IE и вставьте URL-адрес в адресную строку, я перенаправляюсь на страницу входа. Конечно, эти ссылки не включают cookie. – David