我需要在页面上验证从iframe(通过javascript创建)发送的请求。身份验证将通过基本的http身份验证完成。我试过了
http://user:password@server
但显然由于安全例外,这在IE中不可用:
http://support.microsoft.com/kb/834489
我是否可以通过其他方式将身份验证添加到请求中,以便iframe自动对服务器进行身份验证?感谢。
以下是我目前正在使用的代码不起作用:
var url = 'http://userName:test@localhost:12000/Service.svc/GetStatus';
try {
// Attach image to cache auth
var frame = $('<iframe />');
frame.load(function() {
alert('here');
});
$('body').append(frame);
frame.attr('src', url);
//img.remove();
}
catch (e) {
}
答案 0 :(得分:4)
我必须解决这个问题。我能想出的唯一解决方案是使用反向代理。这样的工作方式如下:
Browser (request without basic authentication) -> Reverse Proxy (request with added basic authentication) -> Destination server (requires basic authentication)
因此,有一个反向代理与目标服务器分开运行。基本身份验证的详细信息存储在反向代理中。
假设iframe
中的网址如下(假设反向代理在端口8088
上运行):
<iframe src="http://proxy_id.proxy_host.com:8088/cgi-bin/some/path"></iframe>
反向代理然后将请求翻译为如下所示:
http://destination_host.com:PORT/cgi-bin/some/path
其中destination_host
,PORT
和基本身份验证的详细信息(作为请求标头发送到目标服务器,因此它们在URL中不再可见)取自基于以下内容的反向代理配置原始网址中的proxy_id
。
反向代理会更改host
标头(从*.proxy_host.com
到destination_host.com
),但不会更改路径,因此代理对来自浏览器的任何请求都是透明的,包括下载CSS或JavaScript文件的任何子请求,甚至包括从JavaScript发起的任何请求。
此设置需要适当的DNS条目,以便proxy_id.proxy_host.com
解析为反向代理的IP,destination_host.com
解析为目标服务器的IP。根据要求proxy_host
实际上可能与destination_host
相同(例如,如果代理在目标服务器上运行)。
这是基本的想法。在我的项目中,代理配置可以动态添加,因此我必须确保主域*.some_host.com
的所有子域都解析为相同的反向代理IP。我正在使用Acrylic DNS,因为默认的Windows hosts
文件不支持子域*
(全包)。
根据项目的要求,您可以找到可用于此目的的合适反向代理。我的项目是用Erlang编写的,我找不到任何可以使用的代理,所以我实现了自己的代理。在github上查看它:yoonka/charreada。它还没有任何文档,但代码相当简单。它可能与任何语言编写的任何项目一起使用,但目前的限制是使用Erlang调用添加配置(在我的项目中,它是从另一个Erlang应用程序提供的)。如果只有对此的需求,可以添加从静态文件中读取配置以及更好的文档:)