问题:创建并维护数百个学生账户
我所在的学校在 Server 2008 上运行 Active Directory。每年,我们的学生都必须使用第三方 SaaS 学校管理系统注册账户。这在过去带来了很多工作,因为必须为学生生成代码,而学生经常会丢失代码或不知道如何输入代码。后来,成功注册的学生可能会忘记他们的用户名或密码,然后来找我(单独的系统管理员)重置密码等。
解决方案 1:向用户询问密码
今年秋天,我们改用了新的 SMS,但显然它不支持任何类型的批量学生注册。管理部门计划与每位学生见面,向他们索要用户名和密码,然后手动为他们创建一个帐户。我想,如果我们可以整合这两个系统并避免这种情况,那不是很好吗?然而,当我联系第三方公司时,他们说他们没有与 Active Directory 集成。
我决定建立自己的系统:一个数据库加上一个作为学生账户登录脚本运行的程序。它的工作原理如下:
- 当学生首次登录 Windows 时,系统会要求他们输入密码
- 将根据 Active Directory 中存储的密码检查密码
- 如果匹配,则将密码存储在数据库中(不能简单地将密码从 Active Directory 转储到数据库中,因为 Active Directory 密码是只写的)
- 该程序的服务器端组件使用存储在程序数据库中的 Active Directory 密码为学生在第三方公司创建帐户
新问题
现在,问题在于,如果在 Active Directory 中重置用户的密码,则密码不会在数据库中更新。如果用户从工作站更改密码,则密码不会在数据库中更新。数据库本身也存在安全问题。
解决方案 2:可逆加密
我注意到 Active Directory 可以使用可逆加密存储密码。我知道这并没有得到官方的充分记录,并且我很清楚,即使写下“密码检索”这个词组也有可能带来世界末日。但考虑到风险,我认为我们的服务器不太可能受到攻击,即使受到攻击,攻击者也无法对学生的帐户采取任何行动。
建议?
您建议我如何解决这个问题?有没有办法可以删除中间人数据库并直接使用 Active Directory 中的信息?我是否应该放弃尝试集成系统?
欢迎提出任何想法,包括关于我最初的单点登录想法有多么愚蠢的评论。
答案1
AD 并非设计为密码同步工具;它是一个目录。从中抓取密码并解密(如果我没记错的话,它们的加密方式与 SAM hive 的加密方式相同)不是可行的生产解决方案或受支持的方案。
有很多身份管理解决方案可以使用类似于登录脚本的 API 来捕获 AD 中所做的密码更改并传播它们。不过,自己收集这些数据并不是一个可以编写脚本的事情;您需要编写一个密码策略 DLL。
正确的、无黑客攻击的方法是使用 AD 联合,并让其他应用程序根据 AD 而不是其自己的内部数据库对用户进行身份验证。听起来它不支持这一点,但这可能是值得研究的。