我有两个Web应用程序,有时我需要用户从一个应用程序跳转到另一个应用程序。由于它们是两个Web应用程序并且可能驻留在不同的域/机器上,因此我无法在它们之间共享会话。
对我来说,技术挑战是如何将会话信息(我只需要在会话中传递userID字符串信息)从一个源应用程序传递到另一个目标应用程序 - 这样用户就会感觉单点登录并显示个人信息对于他/她在两个应用程序中(因为userID被传递到目标应用程序,不需要重新登录)。
我当前的解决方案是在两个应用程序中生成所有URL字符串,并在用户成功登录后附加用户ID,如http://www.anotherapplication.com/somepage?userID=someuserID,从会话中检索userID值。但我认为我的解决方案是愚蠢的,我想找到一些方法来自动附加查询字符串?userID = someuserID当用户跳转到另一个应用程序中的另一个URL时 - 这样我只需要生成公共统一URL {{3在两个应用程序中。
是否有自动附加userID查询字符串的解决方案?
提前谢谢, 乔治答案 0 :(得分:2)
如果您使用创建具有所需值的FormsAuthenticationTicket,则可以通过Querystring进行更长时间的维护。
我特别推荐阅读Michael Morozov关于SSO(单点登录)主题的excellent article。
答案 1 :(得分:2)
我不认为在查询字符串中包含用户ID是个好主意。
更好的想法是实施单点登录解决方案。在您的方案中,您可以执行以下操作:
当然,这看起来像是“很多”重定向,但它应该是可靠的,它只发生一次,然后您的用户将在两个应用程序上进行身份验证。
显然,您需要实现一个安全方案,以便检查您传递的身份验证令牌是否真正有效并且来自您的其他应用程序。你可以用挑战 - 响应算法做到这一点;这可能是:
看看: http://en.wikipedia.org/wiki/Challenge-response_authentication
修改强>
关于会话状态,请参阅http://msdn.microsoft.com/en-us/library/ms178581.aspx以获取概述。可以在应用程序之间共享会话状态,但我不会推荐它。如果您的应用程序驻留在不同的域(URL)上,则必须使用cookieless会话状态;这不安全。如果您决定采用这种方式,则必须使用状态服务器或SQL Server进行会话持久性,具体取决于您的设置。
答案 2 :(得分:0)
您可以使用InProc以外的其他内容来保持会话(这是进程中的简称)。如果使用SQL Server后端持久保存会话,则如果设置为使用相同的SQL Server后端进行会话存储,则可以检索会话跨域/计算机。这可以在ASP.NET中配置并支持开箱即用。我建议你仔细查看。