php - 基于单点登录的Web身份验证系统

标签 php security authentication single-sign-on

我希望得到我设计的认证系统的反馈。
要求是创建一个封闭的、单点登录的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_IDAES256进行加密,并使用authrequest对php中的openssl_encrypt使用随机密码。
然后,请求程序通过将其唯一的requestor_id、a':'和base64编码的随机密码连接起来生成信封数据。
然后使用php中的openssl_public_encrypt为处理程序使用预共享公钥对请求者的信封数据进行加密。
然后,请求者向用户发送一个location:头,其中包含加密的envelopeauthrequest作为url参数发送给处理程序。
处理程序将使用信封的私钥对其进行解密,并分离客户端ID和密码。
处理程序将检查requestor_id以查看我们是否配置了此项,如果没有,将通知用户请求者未被识别。
处理程序将对用户进行身份验证(在本例中,通过询问用户名和密码并对照LDAP和/或通过预验证会话进行检查)
然后,处理程序将生成对请求者的返回authtoken
处理程序将使用从信封中解密和解码的密码从SESSION_ID解密authrequest
处理程序将使用信封中解密和解码的密码加密包含SESSION_ID和登录凭据(用户名、guid等)的id的新字符串。
然后,处理程序向用户发送一个location:头,其中包含authtokenas 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/

相关文章:

php - 为什么 PHP 不能在我的 Raspberry Pi 上运行?

PHP/Mysql - 动态选择数据?

powershell - 如何使用 powershell 通过单个用户名/密码提示对 AzureRM 和 AzureAD 进行身份验证

iOS 拒绝连接,因为它既没有出现在 Content Security Policy 的 connect-src 指令和 default-src 指令中

node.js - 如何验证最终用户身份验证 token (使用 Firebase 身份验证)以调用谷歌云运行端点?

java - LDAP 身份验证要求以及如何进行

php - 服务器负载问题

php - 如何根据日期条件(PHP-MySQL-Query)将表中的多行插入到另一个表中?

java - 我应该如何控制对tomcat中图像的访问?

php - 使用仅提供用户名、密码和证书颁发机构的 PHP 连接到 Web 服务