2

是否可以在 Tomcat 6.xxx 中并排使用两种身份验证方法?

故事:现在我的应用程序在端口 80 和 443 上运行。在 443 连接器中有 clientAuth="want" 参数。如果客户超过 80 岁,则不需要证书。但是当客户端超过 443 并且客户端在读卡器中有智能卡时,即使客户端不想登录,也会自动询问证书。

对于使用用户证书登录,我有 FormFallBack 身份验证器,这意味着如果客户端不发送证书(他在读卡器中没有智能卡)或身份验证器中的认证失败,身份验证器将定向到表单,在那里他可以使用密码和用户名登录. 我的英语不是很好,所以这里是类似系统的更好概述:http ://wiki.apache.org/tomcat/SSLWithFORMFallback

但是如果浏览器多次询问证书,如果用户不想使用智能卡登录(但他在阅读器中有它),那么询问用户证书的过程对用户来说很烦人,而是他想用用户名和密码登录。

那么是否有以下选项:我有登录页面,其中有用户名和密码字段以及登录按钮。如果用户按下登录按钮,他将使用用户名和密码登录(定向到表单验证器)。

但在同一页面中有“使用智能卡登录”按钮。如果他按下此按钮,服务器会请求用户证书并将其提供给身份验证器。

希望你能理解问题。

4

3 回答 3

1

如果您通过 servlet 会话保持身份验证状态,您可以通过提供两个不同的按钮(或链接)来提供通过表单或客户端证书登录。

我在这里假设您可以通过客户端证书/login/form获得表单和身份验证等路径。/login/cert

/login/cert在使用 SSL/TLS 重新协商访问时,您可以按需触发客户端证书身份验证。为此,请clientAuth="false"在连接器配置中使用,但在 webapp 中对该路径设置安全约束,使用<auth-method>CLIENT-CERT</auth-method>: 这将在需要时触发重新协商。

为此,您需要支持 RFC 5746(Oracle Java 6 r22 或更高版本)的 JRE 版本,并且您的客户端也应该支持它。现代版本的浏览器/操作系统现在应该支持这一点。

于 2012-05-30T15:07:16.310 回答
1

我相信您将不得不编写自己的 Tomcat 身份验证器来理解这些要求。

这实际上可能是不可能的,因为您要求 AFAICT 能够基于每个用户重新配置 SSL 连接器的行为,并且您无法在 SSL 协商发生之前为用户配置连接器。

于 2012-05-30T14:50:56.937 回答
0

请参阅 Google 代码中的 AuthenticRoast 项目。它确实做到了这一点以及更多。

于 2012-05-30T22:03:22.497 回答