客户使用经典ASP登录其基于Web的后台。
我已经编写了一个新的ASP.Net应用程序,要包含在后台,我需要利用现有的登录系统,这样当他们登录时,他们不需要再次登录新的ASP.Net应用程序。
登录名和密码以明文形式存储在SQL Server数据库中,我可以从我的ASP.Net应用程序访问。
整合这些系统的有效方法是什么?
我目前最好的想法是: 在我的ASP.Net应用程序的链接中,我链接到一个“网关”登录页面,其中包含用户ID和一个散列密码+查询字符串中的常见秘密。然后我将它与数据库中用户的密码进行比较......但问题是,如果拦截了这个查询字符串,它可以用来访问asp.net网站,而不需要实际知道用户名和密码......
我很可能忽略了一些简单的事情。
答案 0 :(得分:9)
我认为你的想法是在正确的道路上。
正如您可能已经知道的那样,经典的asp和asp.net不能共享相同的会话状态,因此您需要有一种机制来从一个登录到另一个。
我要做的是:当有人登录时,创建一个您为该用户保存在数据库中的唯一GUID。从一个站点跳转到另一个站点时,将该GUID传递给查询字符串。当您尝试将它们自动登录到其他站点时,请查找该GUID并查看它是否附加到任何人。如果是,请将其登录。
这样您就不会传递用户可以猜测或解密的任何内容。
答案 1 :(得分:4)
经典ASP系统如何维护登录状态?到目前为止,“小猪支持”将是你最好的选择。
我所使用的所有经典ASP系统都使用cookie来跟踪身份验证信息,所以只需阅读这些并与您可以访问的数据库进行比较。
由于信息存储在Classic ASP会话中,您是否可以将“重定向页面”添加到作为新模块“入口”的经典ASP端,并使其将有用数据写入cookie或触发POST到您的起始页面?通过使用cookie或POST请求,您可以最大限度地减少您对网址“被劫持”的担忧,从而允许某人在没有用户名/密码的情况下进入ASP.net网站。
答案 2 :(得分:2)
您正确地担心MITM类型的攻击,可能是通过DNS缓存中毒或类似攻击。根据您的具体情况,通过向跨应用程序边界传递的登录令牌添加时间约束,可能足以减轻这种情况的潜在影响。
“数据库方法中的GUID”是我过去成功使用的东西,用于在共享相同身份验证数据库的两个应用程序之间传递用户,以及“密码重置电子邮件”类型方案。您可以通过在记录上添加一个列来指定添加GUID的日期,并将应用程序代码修改为仅登录少于x分钟/小时/天的GUID身份验证,从而使此过期。
另一种方法是通过连接类似以下内容来避免数据库中的其他字段:
UserId + [Value representing current time to nearest x minute / hour /day] + Salt
..哈希它,然后在另一个应用程序上复制你的算法并比较两个生成的值。
总的来说,我认为您提出的解决方案适用于该问题。这当然不是太复杂。
答案 3 :(得分:0)
你不能通过Form而不是Querystring提交吗?这将消除它在网址中被截获的可能性。
答案 4 :(得分:0)
如果拦截是一个严重问题,那么您需要通过HTTPS运行该网站。否则,使用随后通过密码进行哈希处理的UserID + Nonce相当强大。
或者,您可以在创建登录后让ASP应用程序添加GUID会话cookie,并将该GUID存储在数据库表中。您的ASP.NET可以从cookie中查找GUID以查看是否已实现登录。如果在表中包含ASP会话cookie值,则可以合理地确定当前ASP会话与创建GUID时使用的会话相同。