如何通过证书交换来验证用户身份?

如何通过证书交换来验证用户身份?

我有一个 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)或硬件获取。从不同的服务器(或使用不同名称的同一服务器)提供静态内容有助于缓解这种情况。

相关内容