我需要验证的请求的网页上从一个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) {
}
我必须解决这个确切的问题。 唯一的解决办法我能想出使用反向代理。 这是这样的:
Browser (request without basic authentication) -> Reverse Proxy (request with added basic authentication) -> Destination server (requires basic authentication)
所以从目标服务器单独运行的地方反向代理。 基本身份验证的详细信息被存储在反向代理。
说,在URL 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
这是在原来的URL。
反向代理将改变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
(如果代理在目标服务器上运行EG)。
这是基本的想法。 在我的项目的代理服务器配置可动态添加,所以我不得不确保主域的所有子域*.some_host.com
解析到相同的反向代理服务器的IP。 我使用的亚克力DNS的,他们作为默认的Windows hosts
文件不支持子域为*
(包罗万象)。
根据您的要求的项目你可以找到可用于该目的适宜的反向代理。 我的项目是用Erlang编写的,我找不到,我可以用任何代理,所以我实现了我自己。 检查它在GitHub上: yoonka /牛仔竞技 。 它没有任何的文件还没有,但是代码是相当简单的。 它可以用任何语言的任何项目可能被使用,但目前的限制是配置正在使用Erlang的调用(如在我的项目是正在从另一个二郎应用程序提供)加入。 从静态文件读取配置,以及一个更好的文档,可如果只存在对任何需求增加:)