覆盖浏览器身份验证对话框

时间:2009-05-21 19:20:24

标签: authentication browser dialog

当从Web服务器收到401消息时,是否有办法使用Java覆盖浏览器身份验证对话框?我想知道何时显示此对话框,而不是将其提供给用户,我会为他们填写凭据。

申请概述:

我编写了Web服务器,所以基本上我想阻止某人打开外部浏览器并放入localhost和端口来访问正在显示的数据。我的应用程序有一个嵌入式Web浏览器链接到我的书面服务器浏览器显示解密的内容,因此如果我强制使用auth(即使是我的嵌入式浏览器),外部浏览器也需要凭据。如果我的嵌入式浏览器试图访问文件,我提供用户的凭据并显示内容

5 个答案:

答案 0 :(得分:1)

SWT 3.5M6中有一个新的监听器,它调用AuthenticationListener。它只是侦听从服务器传递的身份验证事件并被触发。下面的代码是执行我想要的行为的代码。它等待auth,如果主机是我的应用程序,它会传回凭据。当然,请使用适当的变量填写USER_NAME,PASSWORD和HOST_NAME。否则,它会弹出浏览器身份验证对话框并让用户输入凭据。此代码也可以在Eclipse SWT代码段页面中找到:

webBrowser.addAuthenticationListener(new AuthenticationListener()

{

        public void authenticate(AuthenticationEvent event) {
            try {
                URL url = new URL(event.location);

                if (url.getHost().equals(HOST_NAME)) 
                {
                    event.user = USER_NAME;
                    event.password = PASSWORD;
                } 
                else 
                {       
                    /* do nothing, let default prompter run */
                }
            } catch (MalformedURLException e) {
                /* should not happen, let default prompter run */
            }
        }
    });

答案 1 :(得分:1)

如果您不关心密码显示,您可以构建URL,以便传递凭据ex。 http://username:password@www.example.com这将通过身份验证框,但会向用户显示凭据,因此也可能不是您要查找的内容。

答案 2 :(得分:0)

我认为这主要是与浏览器相关的行为以及服务器向浏览器报告的内容。

例如,作为Microsoft产品的Internet Explorer直接支持在401中匿名请求失败后自动发送Windows凭据(您可以在Internet设置中修改此行为)。

例如,Firefox即使设置为通过密码管理器记住id和密码,也不会并且将始终提示用户。 IE也会提示自动登录失败(例如您的Windows凭据仍然会导致401,因为您不允许使用id。)

我不认为,作为一名网络开发人员,除了设置您的服务器和应用程序以最期望和最和谐的方式工作之外,您还可以控制它...如果可以的话,这可能会进入{{3 }}

答案 3 :(得分:0)

如果要控制显示给用户的内容以进行身份​​验证,可以将web.xml的login-config部分中的auth-method从BASIC更改为FORM。

然后,您可以指定在用户进行身份验证时应显示哪个页面,并且,我想,为他们预先填写凭据......但这不会破坏安全性的全部目的吗?

Setting up Authentication for Web Applications

进一步详情后编辑:

我唯一的建议是将auth-method更改为CLIENT-CERT并要求双向SSL,其中客户端也需要向服务器提供证书。如果您将证书安装到嵌入式浏览器中(并确保外部浏览器无法获得证书),那么您应该没问题。实际上,这应该会停止显示任何身份验证对话框。

答案 4 :(得分:0)

你的问题有点不清楚。整个基本身份验证基于HTTP标头。

如果浏览器获得授权标题,则显示对话框。然后,对话框中的内容将发送回服务器。没什么特别的。它是用户名:base64编码的密码。看看

wikipedia

问题是你想要干涉的方式。您必须捕获授权标头,然后为下一个请求更改HTTP标头以包含凭据。

希望有所帮助