我希望得到有关我设计的身份验证系统的反馈。
要求是创建一个封闭的单点登录网络环境,一旦我们的一名员工访问我们的一个网络应用程序,他们就会被要求使用由我们的 LDAP 支持的凭据登录。登录后,他们会在设定的时间段或浏览器会话以及我们所有的 Web 应用程序中保留此登录信息。谷歌的网络资产如何与谷歌帐户一起工作,但对于我们的内部系统。
用户自己在 windows、mac 或 linux 上操作,有些只是在平板电脑上操作,所以这个身份验证环境需要完全在线存在,带有 mod_auth_kerb 等的 kerberos 不会削减它。
我们当前所有的 Web 应用程序都使用 PHP。
到目前为止,我拥有的系统如下所示。
存在一个中央身份验证系统,我将其称为身份验证处理程序,或简称为“处理程序”,以及一个或多个身份验证“客户端”Web 应用程序,我将其称为身份验证请求程序,或简称为“请求程序”。我将把用户和他们的浏览器称为“用户”。
此外,要使其正常工作,需要在处理程序中为请求者预先配置requestor_id
该 ID 的唯一和返回 URL。为处理程序生成一个私钥,并将一个公钥预先提供给所有请求者。
用户访问请求者
- 用户输入请求者的 URL。
- 此用户在请求者上不存在会话,因此请求者
SESSION_ID
在 PHP 中创建一个新的(使用内置会话处理程序和session_start
)。 - 会话没有身份验证,因此请求者将生成一个指向已配置处理程序的 URL,该处理程序由两部分组成,一个
authrequest
令牌和一个envelope
.- 请求者首先
session_regenerate_id
为客户端的此身份验证请求重新生成一个新的 session_id(在 PHP 中)。 - 然后请求者生成一个随机密码,在这种情况下使用 PHP
openssl_random_pseudo_bytes
并将其存储在会话数据中 - 然后,请求者使用PHP using的随机密码对
SESSION_ID
using进行加密。AES256
authrequest
openssl_encrypt
- 然后,请求者通过连接它的唯一
requestor_id
性、':' 和 base64 编码的随机密码来生成信封数据。 openssl_public_encrypt
然后使用PHP中处理程序的预共享公钥加密请求者的信封数据。
- 请求者首先
- 请求者然后向
location:
用户发送一个标头,其中包含加密envelope
的和authrequest
作为 URL 参数的处理程序。 - 处理程序将使用它的私钥解密信封,并将 clientID 和密码分开。
- 处理程序将检查
requestor_id
我们是否配置了这个,如果没有,将通知用户请求者未被识别。 - 处理程序将对用户进行身份验证(在这种情况下,通过询问用户名和密码并检查 LDAP 和/或通过预身份验证会话)
- 然后处理程序将生成一个返回
authtoken
给请求者- 处理程序将
SESSION_ID
使用authrequest
信封中的解密和解码密码解密 SESSION_ID
处理程序将使用信封中的解密和解码密码加密包含登录凭据(用户名、GUID 等)的新字符串和 ID
- 处理程序将
- 然后,处理程序将
location:
包含authtoken
as URL 参数的标头发送给用户,并将其发送到为此的预配置 URLrequestor_id
。 - 请求者接收请求,并将使用用户会话中的密码解密令牌。
- 请求者将确认
SESSION_ID
与用户当前会话匹配,否则它将重新启动身份验证。 - 然后,请求者可以使用返回的 crednetialID 将本地用户标识为已通过身份验证。
这个过程可以在不同的系统中重复,以提供单点登录行为。
所以,问题:
- 有谁知道一个预先存在的、标准化的认证系统,它可以满足与上述类似的要求和预制件?
- 如果不是,并且鉴于我不是安全专家,是否有任何上述内容可能被破坏?即这种方法的弱点是什么?