在经典ASP和ASP.Net之间共享登录系统

12
一个客户使用经典的ASP来登录他们的基于Web的后台管理系统。
我编写了一个新的ASP.Net应用程序,以便将其包含在后台管理系统中,并需要利用已有的登录系统,这样当他们在那里登录时,就不需要在新的ASP.Net应用程序中再次登录。
登录名和密码以明文形式存储在SQL Server数据库中,我可以从我的ASP.Net应用程序中访问。
什么是有效整合这些系统的方法?
目前我最好的想法是: 在指向我的ASP.Net应用程序的链接中,我链接到一个“网关”登录页面,其中包含他们的用户ID和哈希密码+公共秘密。然后我将其与数据库中的用户密码进行比较…但问题是,如果截获这个查询字符串,它可以用来访问asp.net网站,而不实际知道用户名和密码...
我很可能忽略了一些简单的东西。

1
如果将哈希放在查询字符串中,则需要对其进行超时处理,即还需要附加过期日期和时间,并一起发送。当然,他们仍然可以使用它,但至少会超时。 - PQW
5个回答

9

我认为您的想法是正确的。

正如您可能已经知道的那样,经典的asp和asp.net不能共享相同的会话状态,因此您需要有一种机制从一个网站登录另一个网站。

我建议做法是:当有人登录时,创建一个唯一的GUID,并将其保存在数据库中。当您从一个网站跳转到另一个网站时,在查询字符串中传递该GUID。当您尝试自动登录到另一个网站时,查找该GUID并查看是否附加给任何人。如果有,则登录。

这样,您就不会传递用户可以猜测或解密的任何信息。


如果您要在ASP中保存一个值并在ASP.NET代码中比较该值,为什么不保存表示已登录状态的布尔标志呢? - Cerebrus
1
因为关键是要自动将他们从一个环境登录到另一个环境。如果您在asp.net端登录,然后转到asp端,就无法自动知道该人在asp端的身份。在数据库上设置一个标志对此情况没有任何帮助。通过保存GUID,您可以查找与该GUID相关的人员,然后自动将他们登录到任何一个环境中。 - AaronS
正如“Zhaph - Ben Duguid”在下面Rob的答案的评论中所说,您可以在.NET和Classic ASP之间准共享会话状态。http://msdn.microsoft.com/en-us/library/aa479313.aspx我们已经这样做了4年。通过GET或POST传递GUID或其他任何内容会让您暴露于数据包嗅探者的欺骗和会话劫持攻击,除非您使用SSL。 - Kevin
2
这就是我最终实现的内容,它已经在生产环境中运行了将近2年。完美地工作着。 - Kjensen

4
经典ASP系统如何维护登录状态? “顺势而为”是最好的选择。
我所接触的所有经典ASP系统都使用cookie来跟踪认证信息,因此只需读取这些cookie并与您可以访问的数据库进行比较即可。
由于信息存储在Classic ASP会话中,您可以在Classic ASP端添加一个“重定向页面”,作为新模块的“入口”,并将其写入有用的数据作为cookie,或者触发POST到您的起始页面。通过使用cookie或POST请求,您可以最大程度地减少担心URL被“劫持”,从而允许某人在没有用户名/密码的情况下进入ASP.net网站。

他们使用会话 - 这在我所知道的范围内无法在 ASP 和 ASP.Net 之间共享。看着cookies,当我登录到他们的管理系统时,我会得到一个名为“ASPSESSIONxxxxxxxxxxx”的会话 cookie,其中包含一些无意义的字符串“DBHPNPCDKCJHOMHDPFOHEDPA”。因此,在 cookies 上进行附加似乎是不可能的。 - Kjensen
我同意Rob的观点,重定向方案可能是你最终采用的方法,因为.NET无法直接检查ASP站点的会话状态。这种方法也有工作在不同域上的优势,但它并不简单,需要确保其安全性。如果你关心安全性,你应该非常小心地验证/无效化在两个站点之间传递的数据。你不想最终得到一个可以通过猜测或重新播放URL登录的系统。例如,SAML重定向使用重定向的每一侧的证书来确保传递的数据的安全性。 - JohannesH
3
在ASP和ASP.NET之间共享会话状态:http://msdn.microsoft.com/en-us/library/aa479313.aspx - Zhaph - Ben Duguid

2
你正确地担心中间人攻击,可能通过DNS缓存投毒或类似方式进行。根据您的情况,在跨应用程序边界传递的登录令牌中添加时间限制可能已足以减轻潜在的影响。
“数据库中GUID方法”是我过去成功使用的一种方法,既可以用于在两个共享相同身份验证数据库的应用程序之间传递用户,也可以用于“密码重置电子邮件”类型的场景。你可以通过在记录上添加一个指定GUID添加日期的附加列,并修改应用程序代码,只登录x分钟/小时/天内的GUID授权来“过期”它。
另一种选择是避免在数据库中添加额外字段,而是连接类似以下内容的内容:
UserId + [Value representing current time to nearest x minute / hour /day] + Salt

将其哈希,然后在另一个应用程序上复制您的算法并比较生成的两个值。

总的来说,我认为您提出的解决方案适用于该问题。它肯定不会太复杂。


0

你不能通过表单提交而不是通过查询字符串提交吗?这样可以消除在URL中被拦截的可能性。


3
拦截/滥用邮件比获取邮件稍微困难一点,是吗? - Kjensen

0
如果拦截是一个严重的问题,那么您需要在HTTPS上运行网站。否则,使用UserID + Nonce,然后由密码哈希是相当强大的。
或者,您可以让ASP应用程序在登录后添加GUID会话cookie,并将该GUID存储在DB表中。您的ASP.NET可以查找来自cookie的GUID,以查看是否已经登录。如果在表中包含了ASP会话cookie值,则可以相当确信当前的ASP会话是创建GUID时使用的同一会话。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接