我正在和一所大学合作,需要整合我的课程 - 所以他们的学生可以在大学网站上访问它。我们将使用简单的iframe集成。
用户将在学院网站上注册,他们会将用户信息传递给我,这样我就可以开始会话并访问我的网站上的课程页面,通过iframe他们将在他们的网站上显示。
我的网站建立在LAMP上,我正在使用ZEND框架
这是我计划如何做的骨架结构
1)在大学网站上,作为iframe代码的一部分 - 他们将调用我的一个动作类并传递用户电子邮件
<iframe src="http://mywebsite/user/validate/email/alice@gcc.com"></iframe>
2)现在在用户控制器中 - 验证操作 - 我将基本检查用户是否不存在 - 创建新用户或使用他的电子邮件加载现有用户并启动Zend Auth实例并将用户写入存储并重定向到他的课程页面如下所示
$currentUser = $userModel->loadUserProfileByEmail($this->_getParam('email'));
$auth = Zend_Auth::getInstance();
$storage = $auth->getStorage();
$storage->write($currentUser);
return $this->_redirect('/user/my-courses/');
这是我到目前为止 - 显然它有效
我的问题
1)这是最好的方法吗?我没有用户的密码,因为身份验证发生在大学网站上,他们不希望用户直接登录我的网站。
2)这是一个大问题。我对这个特定的大学正在进行此调用的最佳认证方式感到困惑。我如何解决这个问题 - 他们是否通过加密令牌以及iframe调用 - 只有我有密钥才能解密它 - 我没有这样做 - 我不知道我是否过于简单化了。
任何意见或建议将不胜感激 感谢
答案 0 :(得分:4)
我的推荐摘要
<强>详情
在FSSO中,存在“身份提供者”(IP)和“服务提供者”(IP)。学院是身份提供者,您是服务提供者。可以有许多服务提供商。记住IP = College,SP =你。 FSSO的关键点:
According to EDUCAUSE,大多数大学都有FSSO。因此,我的第一个建议是进行实况调查,以检查学院的内容。您的内容将更安全,您的代码更简单,如果他们已经拥有FSSO,您将在晚上睡得更好。幸运的是,我的经验是大学经常有东西,但这些东西的知识不一定是广播 - 你必须挖掘一下。
如果他们没有FSSO,我的下一个建议是建议安装一个。在the options上教育自己,记住单点登录并不意味着联合ID - 你想要两者。
就个人而言,我建议Shibboleth。这是open source。我用过LAMP和ZF1。我知道它有效。有了Shibboleth,学院会设置一个Shibboleth IP,你会setup your SP,你会一起参加data flow of identity,一旦用户登录,你就会在每个连接上接收环境变量信令认证,如这样:
array (
// ...
[Shib-Application-ID] => my_course_catalog
[Shib-Session-ID] => _6c45a07c8bc73190242212124221b7
[Shib-Identity-Provider] => https://shib.college.edu/idp/shibboleth
[Shib-Authentication-Instant] => 2013-12-31T22:42:07.101Z
[Shib-AuthnContext-Decl] => urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
[affiliation] => member@college.edu;staff@college.edu
[eppn] => XXXXXX@college.edu
[unscoped-affiliation] => member;staff
// ...
[REMOTE_USER] => XXXXXX@college.edu
// ...
)
我在ZF1中实现它的方式是一个用于查找Shib-Session-ID
的控制器插件。如果找到,请制作一个Shibboleth资源并使用Shib-Session-ID
和REMOTE_USER
填充,我稍后可以查询我需要的所有内容。如果未找到,请重定向到IP登录页面。 (由于您使用的是IFRAME,don't do this:而是重定向到“无内容显示”/“默认内容”操作。)
如果他们不接受安装FSSO的提议怎么办?然后你必须自己滚动,正如你所指出的那样,你的坚持点就是信任。
他们向你发送令牌(你的#2问题)的问题是,令牌可以被截获(具有不同程度的轻松)和replayed against you。你不能相信你所得到的。您必须接受所提供的内容并询问您信任的来验证所提供的内容。
更大的问题是,你需要知道浏览网页现在的用户是是 的同一用户 仍然已登录。为此您需要大学发布的登录cookie,并且您需要检查该cookie当前是否有效。
没有简单的方法可以安全地完成它。这就是为什么FSSO被发明的原因,所以所有繁重的工作都可以以可证明的安全方式完成。如果你仍然自己推出,我可以提供的最好的模型是Facebook应用程序。在第三方服务器上运行的“app”“看到”登录的Facebook用户的类型。为了帮助您入门,请点击the Facebook tutorial on app authentication。
(目前应用身份验证的方式是IFRAME POST,其中包含登录会话ID,您可以通过Facebook查看...但我知道浏览器不再允许这样做,您必须得到我不确定,有些事要记住。)
从长远来看,FSSO是学院的资产,也是您的福音。如果可能的话,那就去吧。否则,具有身份验证的IFRAME第三方应用程序的最新技术是Facebook到Facebook应用程序交换,所以模型。祝你好运!
答案 1 :(得分:2)
我可能误解了你的问题,但从我收集的内容中你需要:
- 验证用户的方法
- 能够在首次加载时查看他们希望查看的页面及其电子邮件地址。
这个基础只是对称密钥身份验证 - 以下所有内容都是将其混搭的方法。
将您的数据放在一起(电子邮件地址,登陆页面),然后使用强密钥对其进行哈希处理。
在另一端解密,瞧 - 完成。
如果您的密码(密钥)难以猜测,此方法是安全的 - 以下是一种难以破解的方法。
<强> AUTHENTICATION 强>
有几种方法可以做到这一点 - 如果您可以访问他们的服务器(或者那些可以为您插入一些代码的人),那么以下方法就可以了。
创建一个执行以下操作的PHP脚本。
我已经大量过度设计了这一点,以证明一种破坏性的硬化方式的破坏 - 你可以选择自己的方式!
(伪代码)
$serverTimeStamp = timestamp;
$additionalNoise = "THEcat1sch33sy";
$time = $serverTimeStamp . "XAB"; <- needs to be a random code as delimeter.
$data = $additionalNoise + "email@email.com";
$salt = "wh4tW0u1dB4tm4nD0?" + $serverTimeStamp;
$ password然后需要使用可逆散列进行散列(mcrypt是一个很好的起点)
$encrypted = mcrypt of $data and $salt ($salt is shared key);
$authenticationcode = $time . $encrypted;
这会给你一个非常强大的随机字符串,前面有一个时间戳,然后是XAB,然后是一个随机的散列字符串。
然后将其传递给您的用户验证脚本。
<iframe src="http://yoursite/validate/COMPLETELYRANDOMSTRING"></iframe>
从那里你可以改变这个过程。
重要(修订) - 我完全忘记了一个IMPORTANT元素 - 存储在数据库中发送给您的随机字符串。这些字符串是“一次性使用” - 如果你再次收到相同的字符串则是攻击。
这可以通过盐中和字符串开头的时间戳来实现 - 可以使用完全不同的字符串每天发送1000次相同的数据。
Get random string.
get time-stamp from front of random string -> using regex / index of looking for numbers and then XAB (hence the random XAB string - it is just a separator)
$timeStamp = "10200192XAB";
"wh4tW0u1dB4tm4nD0?" <-shared secret key.
$salt (secret key) = "wh4tW0u1dB4tm4nD0?" + $timeStamp;
使用salt解密
您的数据前面有
"THEcat1sch33sy" (your additional noise) (which is also a fixed shared key in effect)
只需删除“THEcat1sch33sy”,然后你就可以获得你的电子邮件地址(然后你可以在百万分之一的机会中验证随机字符串实际上是在发送“THEcat1sch33sy”。
Voila - 不是100%而是相信我 - 如果我想进入你的服务器 - 我不会这样试试!
通过
页面Simply add it to the $data - so you would pass $email + "seperator" + $coursepage.
希望这有助于(并且很清楚)