2012-04-06 4 views
0

У меня есть приложение ASP.NET MVC3 с проверкой подлинности форм, и оно работает нормально в течение некоторого времени. Я в процессе тестирования аудиотекстов html5, где атрибут src аудиофайлов, будь то mp3 или ogg, указывает на действие MVC3 GET, которое принимает идентификатор guid для некоторого аудиосодержания. Метод действия возвращает FileStreamResult и довольно счастливо позволяет воспроизводить звук в MSIE9 (mp3), FireFox 9+ (oga) и Chrome 18 (oga). В Safari 5.1.4 mp3, который он должен поддерживать, не воспроизводится.Использование HTML5 Audio с проверкой подлинности форм в SAFARI

Дальнейшие исследования показывают, что запрос к методу действия в случае сафари не проверен аутентификацией, и поэтому при проверке заголовков запросов я вижу, что cookie-файл .aspxauth отсутствует в запросе. Другие ссылки действий, выбранные до и после попытки звукового тега по его запросу, отправляют файл .aspxauth cookie.

Есть ли способ заставить сафари отправлять файлы cookie для проверки подлинности? Я должен указать, что отключение авторизации для этого действия не является вариантом.

С тех пор я пробовал это в последнем Safari 5.1.5 без везения.

ответ

1

Я столкнулся с этим вопросом и придумал следующее обходное решение проблемы. Он использует XMLHttpRequest, который использует файлы cookie для захвата кодированной в Base64 версии файла.

var mediaElem = document.getElementById("media"); 

/* 
safari doesn't pass cookies with audio tag. User agent sniffing is not a good way 
to handle detection, but I am not sure what feature to sniff in this case, since 
currentSrc appears to be set as long as the response status is 200 OK 
*/ 
if(navigator.userAgent.toLowerCase().indexOf("chrome") < 0 && 
    navigator.userAgent.toLowerCase().indexOf("safari") >= 0) 
{ 
    var xmlhttp = new XMLHttpRequest(); 
    xmlhttp.open("GET", "mediaFile.base64"); 
    xmlhttp.onreadystatechange = function() 
    { 
     //DONE readystate 
     if(xmlhttp.readystate = 4) 
     { 
      mediaElem.src = "data:audio/mpeg;base64," + xmlhttp.responseText; 
     } 
    } 
    xmlhttp.send(); 
} 

Тогда все, что вам нужно, это ваш аудио-тег где-то в вашем html.

<audio id="media"> 
    <source src="mediaFile.mp3" /> 
    <source src="mediaFile.ogg" /> 
    Fallback statement... 
</audio> 
Смежные вопросы