2009-10-23 79 views
6

我正在设计一个RESTful Web服务(JBoss + RESTeasy)。 UI程序员正在编写一个将使用它的Ajax Web应用程序。 Web应用程序将是一个HTML页面,其中所有内容都是用JavaScript完成的。为了安全起见,所有流量都通过SSL。Ajax认证,不让浏览器弹出登录对话框

当前我正在使用基本身份验证。 UI程序员可以显示一个对话框来获取用户名和密码,并在标题中放入“Authorization:Basic xxxxx”。不幸的是,如果密码错误,会出现难看的浏览器登录对话框。此外,用户无法注销。这是无法接受的。

那里看来是没有办法拦截任何我们将使用浏览器的401响应一个XMLHttpRequest。

基于表单的身份验证不适用于我们。我们需要在一段时间不活动后自动注销(相当于会话超时)。当客户端期望一个JSON对象时,我们不能让服务器突然返回一个登录页面。

的JBoss提供了四种验证策略:BASIC,FORM,CLIENT-CERT和消化。我认为DIGEST与BASIC有同样的问题。四个都不是我们想要的。

此Web应用程序将是唯一的客户端(现在)所以不需要使用BASIC。是否有任何其他身份验证策略可以安装?例如,我可以使用WSSE UsernameToken的实现吗? (如O'Reilly RESTful Web服务手册第8章所述。)服务器将在WWW-Authenticate头部中发送“WSSE”而不是“Basic”,并且可能浏览器会忽略它并将其传递给它。

我要配置安全性,它属于 - 在JBoss的配置文件,而不是在我的RESTful Web服务 - 所以我在寻找一个实现我可以插入JBoss的。

回答

7

的浏览器不会出现密码对话框,如果它不承认在WWW身份验证标头的身份验证方案。您最好的选择可能是继续在服务器上使用基本身份验证,而手动将标头设置为类似“Basic/MyApp”的401响应。

+0

验证在请求到达Web服务之前完成。我可以通过编写一个位于安全框架之前的过滤器来处理这个问题吗?然后我可以告诉网络程序员在第一个请求中添加一个“Authorization:Basic/MyApp”标头。过滤器可以将其重写为“Authorization:Basic”,并在响应中将“WWW-Authenticate:Basic”标题重写为“WWW-Authenticate:Basic/MyApp”。任何其他客户端都可以使用普通的基本认证这会工作吗?我认为可能。 – 2009-10-26 02:00:02

+0

嗯......我假设你已经在服务器上的脚本级别上控制了身份验证,并且在处理身份验证之后但在返回响应之前设置标题。我对JBoss并不太熟悉,但是如果你可以在auth发生之前过滤和重写请求,听起来好像它是你最好的选择。通过在Web应用程序中设置授权标头,普通客户端不会受到影响。尼斯。 – 2009-10-26 05:41:58

+0

事实证明,您不能拥有预登录过滤器。 WebLogic服务器允许它,但标准不允许它,而JBoss和Tomcat不允许它。看起来我不得不摆弄JAAS来做到这一点。 – 2009-10-26 19:27:37

相关问题