如何在ASP.Net中的不同应用程序之间发送用户ID?

如何在ASP.Net中的不同应用程序之间发送用户ID?,asp.net,session,Asp.net,Session,我有两个web应用程序,都是在ASP.NET中开发的。现在,我想提供一个功能,使用户能够从应用程序站点a(IIS的一个虚拟目录)中的一个URL单击到应用程序站点B(IIS的另一个虚拟目录)中的另一个URL 我有两个想法来实现它们,但它们都有问题。我想知道什么样的解决方案应该是最佳解决方案 解决方案1:使用cookie,所以从两个应用程序站点,我们可以从读取cookie中检索用户ID信息,但我担心,如果浏览器中禁用cookie,这种“跳转”功能将永远无法工作 解决方案2:当用户重定向到另一个站点中

我有两个web应用程序,都是在ASP.NET中开发的。现在,我想提供一个功能,使用户能够从应用程序站点a(IIS的一个虚拟目录)中的一个URL单击到应用程序站点B(IIS的另一个虚拟目录)中的另一个URL

我有两个想法来实现它们,但它们都有问题。我想知道什么样的解决方案应该是最佳解决方案

解决方案1:使用cookie,所以从两个应用程序站点,我们可以从读取cookie中检索用户ID信息,但我担心,如果浏览器中禁用cookie,这种“跳转”功能将永远无法工作

解决方案2:当用户重定向到另一个站点中的URL时,我可以在URL后附加用户ID,我可以重定向到另一个站点中的此URL,但我担心这样会很容易暴露用户ID,这会引起安全问题。

我认为1)由于浏览器安全性的原因无法工作(来自一个域的Cookie不能被另一个域读取)。我会选择2),除非我会加密querystring值


编辑:有关cookie隐私/安全问题的更多信息,请查看“隐私和第三方cookie”部分。

您使用什么作为用户id?如果您使用的是他们的社会保险号码或电子邮件(某些敏感信息),那么您需要在将该值放入查询字符串之前对其进行加密。否则(如果用户的id是不明确的,比如整数或GUID),则可以将id放在查询字符串上。

只要您在第二个网站上有一个良好的身份验证系统,我认为解决方案2适合您,当然要考虑到Andrew关于敏感id的评论


有关加密的更多信息:请查看的文档。在那个例子中,我认为他们甚至可以在cookie中写一个值。

使用跨域,您无法共享会话,所以我考虑了POST

想法1

如果害怕在地址中“显示”用户名,为什么不发送帖子

<form name="myForm" action="http://www.mydomain.com/myLandingPage.aspx">
  <input type="hidden" id="userid" value="myUsername" />
  <a href="javascript:myForm.Submit();">click here</a>
</form>
您可以使用Rijndael算法执行此操作,下面的链接包含VB和C代码:


然后在站点2中,只需解密并检查用户是否存在。。。如果是,继续,如果不是说用户试图调整查询字符串:)

如果您将用户id放入查询字符串中,并且这是第二个应用程序用于允许登录的所有内容,那么有什么可以阻止我手动键入其他用户id?您仍然需要在新站点上提示输入密码

我会使用一个数据库来保存登录信息,并让两个站点引用相同的数据库。像使用会话一样使用它


我经常做这种事情。您所寻找的听起来像是一个候选的单点登录解决方案或联合安全性

您可以尝试执行以下类似操作:

  • 使用两列“nonce”和“username”创建一个简单的db或其他类型的表存储

  • 构建到其他站点的链接时,请创建GUID或其他唯一标识符以用作一次性nonce,并将其作为querystring?id=。使用当前已验证的用户名和您创建的唯一标识符在表中插入一个条目

  • 当您到达链接的目的地时,传递唯一标识符以调用Web服务,该Web服务将在跳转到第二个站点之前将标识符与您插入的数据库中的用户名匹配(使用ssl进行保护)

  • 如果nonce使用有效的用户名签出,则所有设置都已设置。WebService应该删除已使用的条目,并且当您不在事务的中间时,表应该保持或多或少的空。

  • 在nonce/username表中包含一个datetime并在60秒或更短的时间内使其过期也很好,这样可以将重播攻击的风险降至最低。我们还需要外部应用程序的客户端证书来调用webservice,以便验证调用方的身份。内部应用程序实际上不需要使用客户端证书

    这方面的一个好处是,它可以很好地扩展到您想要使用的任意多个站点


    虽然不是完美的安全性,但我们从未与这样的系统有过重大妥协。

    谢谢Kevin Tighe!“我认为1)由于浏览器安全性(来自一个域的cookie不能被另一个域读取)而无法工作。”--我有兴趣了解有关此安全限制的更多信息,您是否有关于cookie限制的更多相关文档?关于,GeorgeI对如何“加密querystring值”非常感兴趣。我以前从未这样做过。你能推荐一些示例代码给我学习吗?如果他只是简单地在同一个网站上从一个虚拟目录重新定向到另一个虚拟目录,cookies绝对可以工作。Cookie甚至可以用于子域(app1.myDomain.com可以从app2.myDomain.com读取Cookie)。谢谢Chris,我将来会有跨域的场景。Cookie在这种情况下不起作用,对吗?Chris关于Cookie问题的看法是正确的,但是如果你要使用两个完全不同的域,那么Cookie将不起作用(例如,如果浏览器允许任何网站读取你的gmail Cookie怎么办?那么你访问的任何网站都可能劫持你的gmail帐户)。谢谢Andrew Hare,关于“在将值放入查询字符串之前对其进行加密”的想法,我非常感兴趣,认为这应该是一个好主意。你能给我推荐一些教程或示例代码来学习吗?我以前从未这样做过。:-)如果FormsAuthentication.Encrypt方法使用cookie,但其他域是否可以使用cookie?我认为无法从其他域检索cookie信息?:-)谢谢我目前的困惑是如何编写可以加密用户ID并通过POST方法发送到另一个站点的代码?有没有要学习的示例代码?我没有看到如何在javascript代码中使用
     http://www.anotherapplicationsite.com/somesuburl?userID=HhN01vcEEtMmwdNFliM8QYg+Y89xzBOJJG+BH/ARC7g=