在Tomcat 6.xxx中可以同时使用两种身份验证方法吗?
故事:现在我的应用程序运行在端口80和443上。在443连接器中有clientAuth="want“参数。如果客户端超过80,则不需要证书。但是当客户端超过443并且客户端在读卡器中有智能卡时,即使客户端不想登录,证书也会被自动询问。
对于使用用户证书登录,我有FormFallBack认证器,这意味着如果客户端没有发送证书(他的读卡器中没有智能卡)或者认证器认证失败,认证器直接转到表单,他可以使用密码和用户名登录。我的英语不是很好,所以下面是类似系统的更好的概述:http://wiki.apache.org/tomcat/SSLWithFORMFallback
但是,如果浏览器多次询问证书,则询问用户证书的过程对用户来说是恼人的;如果用户不想使用智能卡登录(但他在阅读器中有智能卡),则他想使用用户名和密码登录。
所以有以下选项:我有登录页面,其中有用户名和密码字段和登录按钮。如果用户按下登录按钮,他将使用用户名和密码登录(定向到form authenicator)。
但在同一页面上有“使用智能卡登录”按钮。如果他按下此按钮,服务器将要求用户证书并将其提供给身份验证器。
希望你能理解这个问题。
发布于 2012-05-30 22:50:57
我相信您必须编写自己的Tomcat身份验证器来理解这些需求。
这实际上可能是不可能的,因为AFAICT要求能够在每个用户的基础上重新配置SSL连接器的行为,并且您不能在SSL协商发生之前为用户配置连接器。
发布于 2012-05-30 23:07:16
如果在servlet会话中保持身份验证状态,则可以通过提供两个不同的按钮(或链接),通过表单或客户端证书登录。
我在这里假设您可以使用像/login/form这样的路径作为表单,/login/cert作为通过客户端证书进行身份验证的路径。
当使用SSL/TLS重新协商访问/login/cert时,您可以按需触发客户端证书身份验证。为此,在连接器配置中使用clientAuth="false",但使用<auth-method>CLIENT-CERT</auth-method>在webapp中的该路径上放置一个安全约束:这将在需要时触发重新协商。
为此,您需要一个版本的JRE that supports RFC 5746 (OracleJava6 r22或更高版本),而且您的客户机也应该支持它。现代版本的浏览器/操作系统现在应该支持这一点。
发布于 2012-05-31 06:03:22
请参阅Google Code中的AuthenticRoast项目。它做的就是这件事,甚至更多。
https://stackoverflow.com/questions/10817683
复制相似问题