iframe中网址的基本身份验证

mrK*_*mrK 6 authentication iframe internet-explorer basic-authentication

我需要在页面上验证从iframe(通过javascript创建)发送的请求.身份验证将通过基本的http身份验证完成.我试过了

http://user:password@server
Run Code Online (Sandbox Code Playgroud)

但由于安全性异常,显然这在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) {

}
Run Code Online (Sandbox Code Playgroud)

Gre*_*reg 6

我必须解决这个确切的问题。我能想到的唯一解决方案是使用反向代理。这像这样工作:

Browser (request without basic authentication) -> Reverse Proxy (request with added basic authentication) -> Destination server (requires basic authentication)
Run Code Online (Sandbox Code Playgroud)

所以有一个反向代理运行在与目标服务器分开的地方。基本身份验证的详细信息存储在反向代理中。

假设 URLiframe看起来像这样(假设反向代理在端口上运行8088):

<iframe src="http://proxy_id.proxy_host.com:8088/cgi-bin/some/path"></iframe>
Run Code Online (Sandbox Code Playgroud)

然后反向代理将请求转换为如下所示:

http://destination_host.com:PORT/cgi-bin/some/path
Run Code Online (Sandbox Code Playgroud)

其中destination_host,PORT基本身份验证的详细信息(作为请求标头发送到目标服务器,因此它们在 URL 中不再可见)是从基于proxy_id原始 URL 中的反向代理配置中获取的。

反向代理将更改host标头(从*.proxy_host.com到destination_host.com)但不会更改路径,因此代理对来自浏览器的任何请求都是透明的,包括任何下载 CSS 或 JavaScript 文件的子请求,甚至对任何发起的请求来自 JavaScript。

此设置需要适当的 DNS 条目,以便proxy_id.proxy_host.com解析为反向代理destination_host.com的 IP并解析为目标服务器的 IP。根据要求proxy_host实际上可以相同destination_host(例如,如果代理在目标服务器上运行)。


这是基本的想法。在我的项目中,可以动态添加代理配置,因此我必须确保主域的所有子域都*.some_host.com解析为相同的反向代理 IP。我为此使用了Acrylic DNS,因为默认的 Windowshosts文件不支持子域*(catch-all)。

根据您项目的要求,您可能能够找到可用于该目的的合适的反向代理。我的项目是用 Erlang 编写的,我找不到任何可以使用的代理,所以我实现了自己的。在 github 上查看:yoonka/charreada。它还没有任何文档,但代码相当简单。它可能与用任何语言编写的任何项目一起使用,但目前的限制是使用 Erlang 调用添加配置(如在我的项目中,它是从另一个 Erlang 应用程序提供的)。如果有任何需求,可以添加从静态文件中读取配置以及更好的文档:)