我希望得到我设计的认证系统的反馈。
要求是创建一个封闭的、单点登录的web环境,在该环境中,一旦我们的一名员工访问了我们的一个web应用程序,就会要求他们使用ldap支持的凭据登录。一旦登录,他们将在一个设定的时间段内或浏览器会话中以及在我们所有的web应用程序中保留此登录。google的web属性如何与google帐户一起工作,但对于我们的内部系统。
用户本身从windows、mac或linux操作,有些则从平板电脑操作,因此这种身份验证环境需要单独在线存在,带有mod_auth_kerb等的kerberos不会切断它。
我们当前的所有web应用程序都使用php。
到目前为止,我的系统工作如下。
存在一个中央身份验证系统,我将称之为身份验证处理程序,简称为“处理程序”,以及一个或多个身份验证“客户端”web应用程序,我将称之为身份验证请求程序,简称为“请求程序”。我将用户和他们的浏览器称为“用户”。
此外,为了让它工作,请求者需要在处理程序中预先配置一个惟一的requestor_id
并返回该id的url。
将生成处理程序的私钥,并在提交之前向所有请求者提供公钥。
用户访问请求者
用户输入请求者的url。
请求程序上不存在此用户的会话,因此请求程序在php中创建一个新的SESSION_ID
(带有内置会话处理程序和session_start
)。
会话没有身份验证,因此请求者将生成一个指向配置的处理程序的url,该处理程序由两部分组成,一个authrequest
令牌和一个envelope
。
请求者首先为客户端的此身份验证请求重新生成一个新的会话id(session_regenerate_id
,在php中)。
然后,请求者使用php的openssl_random_pseudo_bytes
生成一个随机密码,并将其存储在会话数据中
然后,请求者使用SESSION_ID
对AES256
进行加密,并使用authrequest
对php中的openssl_encrypt
使用随机密码。
然后,请求程序通过将其唯一的requestor_id
、a':'和base64编码的随机密码连接起来生成信封数据。
然后使用php中的openssl_public_encrypt
为处理程序使用预共享公钥对请求者的信封数据进行加密。
然后,请求者向用户发送一个location:
头,其中包含加密的envelope
和authrequest
作为url参数发送给处理程序。
处理程序将使用信封的私钥对其进行解密,并分离客户端ID和密码。
处理程序将检查requestor_id
以查看我们是否配置了此项,如果没有,将通知用户请求者未被识别。
处理程序将对用户进行身份验证(在本例中,通过询问用户名和密码并对照LDAP和/或通过预验证会话进行检查)
然后,处理程序将生成对请求者的返回authtoken
。
处理程序将使用从信封中解密和解码的密码从SESSION_ID
解密authrequest
。
处理程序将使用信封中解密和解码的密码加密包含SESSION_ID
和登录凭据(用户名、guid等)的id的新字符串。
然后,处理程序向用户发送一个location:
头,其中包含authtoken
as url参数,并将其发送到为此requestor_id
预配置的url。
请求者接收请求,并在用户会话中使用密码解密令牌。
请求者将确认SESSION_ID
与用户当前会话匹配,否则将重新启动身份验证。
然后,请求者可以使用返回的crednetialid将本地用户标识为已验证。
这个过程可以在不同的系统中重复,以给出单一的登录行为。
所以,问题是:
有人知道一个预先存在的,标准化的认证系统,满足上述要求和预成型类似吗?
如果不是,而且我不是安全专家,上面有什么东西可能会被破坏吗?也就是说,这种方法的弱点是什么?
最佳答案
您可以使用kerberos:http://web.mit.edu/kerberos/www/
或者实现内部openid系统:http://openid.net/
还有几个用于openid的php库:http://openid.net/developers/libraries/
关于php - 基于单点登录的Web身份验证系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12813918/