![如何通过证书交换来验证用户身份?](https://linux22.com/image/626300/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E8%AF%81%E4%B9%A6%E4%BA%A4%E6%8D%A2%E6%9D%A5%E9%AA%8C%E8%AF%81%E7%94%A8%E6%88%B7%E8%BA%AB%E4%BB%BD%EF%BC%9F.png)
我有一个 Web 应用程序 A,用户必须通过用户名/密码方法进行身份验证(https://server.local/webappA)。与服务器A建立安全连接(HTTPS)。
然后,这些人想通过某种“诡计”来使用同一个经过身份验证的用户打开不同的 URL(https://server.local:8080/webappB/?param1=PID),同时还要确保身份验证没有被破坏。换句话说,他们不希望用户再次为 webappB 输入其凭据。此外,未经身份验证的用户不应访问这个新的 webappB。
WebappB 在 Tomcat 中运行,可以托管在同一台服务器上的不同端口号上。如果 webappA 有一个众所周知的身份验证系统(如 LDAP),我们的工作可能会容易得多,但他们没有。WebappA 来自公司 A,WebappB 来自公司 B。
这有可能奏效吗?我个人不知道怎么做,所以我可能会和你们一起尝试。我可以自由安装我需要的任何 Apache mod 或服务器。
答案1
假设两个应用程序都可以访问类似的会话数据,这并不太难。但前提是您可以稍微调整一下代码。由于您谈论的是提供软件的不同公司,因此第二部分可能不可行。
基本上,当会话开始时,AppA
用户名/密码会根据某个源(无论是数据库、IMAP 服务器、LDAP 服务器还是其他)进行检查,这实际上并不是该过程的重要部分。在第一次收集用户名/密码之后,会话令牌发出。 AppA
检查会话令牌访问时如果有效,则加载会话(因此每次执行某项操作时不需要用户名/密码)。
为了实现这个功能你AppB
需要(A)能够访问该会话令牌(很简单,它很可能被存储为 cookie),(二)访问列出有效令牌和用户相关信息的会话数据(如果用户未在 cookie 中包含令牌),并且(C)在没有用户名/密码的情况下创建一个会话AppB
,或者根据现有会话进行验证。
会话令牌访问:
这应该只是读取提供给 的 cookie 的问题AppB
。只要AppA
发出没有限制值的 cookie path
(风险很低,因为 A 公司无法知道AppA
可以操作的所有文件夹)。
会话数据访问:
通常,应用程序会将会话信息存储在某种数据库表中。唯一的技巧可能是了解与会话关联的用户名(令牌可能包括用户名或某种 ID,或两者都不包含)。AppA
应遵守由定义的会话有效性AppB
创建 AppB 会话:
可能最棘手的部分是,如果AppB
在身份验证模块上具有依赖注入(包括会话启动、会话检测和会话终止),那么只需要让应用程序读取相同的会话令牌,与AppA
会话数据进行比较/验证,并在需要时进行翻译和扩展。 笔记除非两个应用程序都进行了修改,否则你还需要AppB
推迟登录并可能注销AppA
安全:
如果AppA
使用 cookie 来存储/检索没有路径值的会话信息,请注意同一网站的任何其他部分也可以看到此 cookie。如果网站的某些部分http
(包括图像、样式表和 javascript)被提供,则此会话 cookie 将被暴露并可通过嗅探软件(如 firesheep)或硬件获取。从不同的服务器(或使用不同名称的同一服务器)提供静态内容有助于缓解这种情况。