在 SAFARI 中使用带有表单身份验证的 HTML5 音频

Posted

技术标签:

【中文标题】在 SAFARI 中使用带有表单身份验证的 HTML5 音频【英文标题】:Using HTML5 Audio with forms authentication in SAFARI 【发布时间】:2012-04-06 04:44:31 【问题描述】:

我有一个带有表单身份验证的 ASP.NET MVC3 应用程序,它已经运行了一段时间。我正在尝试 html5 音频标签,其中音频文件的 src 属性(无论是 mp3 还是 ogg)指向一个 MVC3 GET 操作,该操作接受某些音频内容的 guid id。 action 方法返回一个 FileStreamResult 并且非常高兴地允许在 MSIE9 (mp3)、FireFox 9+ (oga) 和 Chrome 18 (oga) 中播放音频。在 Safari 5.1.4 中,它应该支持的 mp3 无法播放。

进一步调查表明,在 safari 的情况下对 action 方法的请求是未经身份验证的,因此在检查请求标头时,我可以看到 .aspxauth cookie 不在请求中。在音频标签尝试其请求之前和之后选择的其他操作链接都发送 .aspxauth cookie。

有没有办法强制 safari 发送身份验证 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>

【讨论】:

以上是关于在 SAFARI 中使用带有表单身份验证的 HTML5 音频的主要内容,如果未能解决你的问题,请参考以下文章

带有 XML 文件的身份验证表单

表单身份验证重定向 css/脚本包含到带有 HTTP 302 的登录页面

带有新身份验证方法的 Symfony 简单登录表单不起作用

Safari 中视图状态 MAC 的验证失败

(Monaca,Cordova)带有表单身份验证(Cookie)的 Web API 请求不起作用

表单身份验证超时与会话超时