网站(外部网站)的用户需要重定向到我的网站。 与重定向一起,将传输有关用户的数据,不应使用查询字符串发送。
但是,我怀疑如何以安全的方式执行此操作,以确保重定向(和数据)实际上来自外部合作伙伴。
我最初的想法是创建一个将令牌返回到外部站点的oauth身份验证服务器。如果提供了有效的用户名和密码,则将返回令牌,并且仅在设定的时间内有效。
然后,该令牌应用于将数据从外部站点传输到我的API / MVC站点。但是我被困在如何继续,因为我不认为网络服务器可以在同时重定向时传输身份验证令牌。
如何匹配重定向和数据,同时确保外部网站是值得信赖的合作伙伴?
答案 0 :(得分:0)
我会使用类似OAuth的方法。两个服务器都有共享密钥(GUID或其他东西)。在呈现表单时,服务器A将生成随机的“随机数”令牌。它还获取时间戳(对于OAuth,它是自1970年1月1日以来的秒数)。您将字符串连接为nonce,timestamp和shared secret,然后对它们进行哈希处理(使用SHA或其他)。此散列值称为签名。然后包含以下隐藏输入参数:
当服务器B收到响应时,它会执行以下操作:
随机数不是普遍唯一的,它们仅在特定时间范围内是唯一的。为了跟踪它们,您必须在全局范围内保留字典。关键是nonce,值是使用它的时间戳。请求进入时,在字典中查找nonce。如果与其关联的时间戳在服务器B的时钟的+/- X分钟内,则拒绝该请求。如果它超出了您的范围,或者它还没有在字典中,那么请允许该请求并将该随机数和时间戳添加到字典中。
重点是防止重播攻击。机器人无法嗅探流量,抓取明显可见的随机数,时间戳和签名,并使用不同的有效负载再次将其发送到服务器B.
关于时间戳范围(上面的X)的说明,在OAuth中它有一个目的:在服务器时钟的差异之间提供缓冲。在这方面,它通常很短 - 几分钟。在您的情况下,服务器A在初始页面加载时生成随机数,因此时间戳范围必须包括用户填写表单的时间。我建议时间戳不能超过当前服务器时间超过几分钟,但它们可以在服务器时间之后30-60分钟。缺点是你的nonce字典必须保持更长的值。