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

Authentication 覆盖浏览器身份验证对话框,authentication,browser,dialog,Authentication,Browser,Dialog,当从web服务器收到401消息时,有没有一种方法可以使用Java超越浏览器身份验证对话框?我想知道何时显示此对话框,而不是将其提供给用户,而是填写他们的凭据 应用概述: 我编写了web服务器,因此本质上我想阻止某人打开外部浏览器并输入localhost和端口以访问显示的数据。我的应用程序有一个链接到我的书面服务器的嵌入式web浏览器。浏览器显示解密的内容,因此如果我强制进行身份验证(即使对于我的嵌入式浏览器),外部浏览器将需要凭据。如果我的嵌入式浏览器正在尝试访问文件,我将为用户提供凭据并显示内

当从web服务器收到401消息时,有没有一种方法可以使用Java超越浏览器身份验证对话框?我想知道何时显示此对话框,而不是将其提供给用户,而是填写他们的凭据

应用概述:


我编写了web服务器,因此本质上我想阻止某人打开外部浏览器并输入localhost和端口以访问显示的数据。我的应用程序有一个链接到我的书面服务器的嵌入式web浏览器。浏览器显示解密的内容,因此如果我强制进行身份验证(即使对于我的嵌入式浏览器),外部浏览器将需要凭据。如果我的嵌入式浏览器正在尝试访问文件,我将为用户提供凭据并显示内容

如果要控制向用户显示的身份验证内容,可以将web.xml的login config部分中的auth方法从BASIC更改为FORM

然后,您可以指定当用户进行身份验证时应该显示什么页面,并且,我想,为他们预填充凭据……但这不就违背了安全性的全部目的吗

详细信息后编辑:


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

如果您不关心显示的密码,您可以构造URL,使其通过凭据,例如。这将通过身份验证框,但会向用户显示凭据,因此也可能不是您要查找的内容。

您的问题有点复杂不清楚的。整个基本身份验证都基于HTTP头

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

问题是你想如何干预。您必须捕获授权标头,然后对于下一个请求,您必须更改HTTP标头以包含凭据


希望这会有所帮助

我认为这主要是依赖于浏览器的行为,以及服务器向浏览器报告的内容

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

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


我认为,作为一名web开发人员,除了将服务器和应用程序设置为以最期望和最和谐的方式工作之外,您没有多少控制权。。。如果可以,这可能会进入。

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

webBrowser.addAuthenticationListener(新建AuthenticationListener())

{


谢谢你的回复。我正在试图找到最好的解释方式。我编写了web服务器,因此本质上我想阻止某人打开外部浏览器并输入本地主机和端口。我的应用程序有一个嵌入式web浏览器链接到我编写的服务器。浏览器显示解密的内容,因此如果我强制验证(即使是我的嵌入式浏览器),外部浏览器将需要凭据。如果我的嵌入式浏览器正在尝试访问文件,我将为用户提供凭据并显示内容。好的,Ken,建议您使用此评论中的详细信息更新您的问题…我将更新我的回答谢谢您的建议Michael。仍然不确定我将使用什么方法来绕过此问题问题,但您的想法很有用。也感谢您的回复。我希望这种情况发生在后台。如果用户使用我的嵌入式浏览器登录到我的应用程序,他们根本不知道需要凭据。因此,我想对我的凭据保密。这是因为外部浏览器尝试访问同一文件/端口时可能会丢失凭据我只为我的嵌入式浏览器提供数据库的凭据。我已经让它来回发送所有标题,如果我输入凭据,我可以访问我的内容。我想知道如何在java中截取该验证标题(因此不会显示对话框)并填写这些凭据。正如您所说的。我上面的一些评论基本上描述了我的应用程序,供您参考。您是否可以使用此ID?它似乎对我没有任何影响,并且侦听器从未被调用。@willcodejavaforfood-如果它试图进行身份验证,而不是试图进行授权,则此操作将有效。我遇到了与您相同的问题我只是像Redwolfs建议的那样在URL中传递凭据。
        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 */
            }
        }
    });