如何在app域之间传递经过身份validation的会话

假设您有网站www.xyz.com和www.abc.com。

假设用户访问www.abc.com并通过普通的ASP .NET成员资格提供程序进行身份validation。

然后,从该网站,他们被发送到(重定向,链接,无论什么工作)网站www.xyz.com,网站www.abc.com的意图是将该用户传递到另一个网站作为isAuthenticated的状态,这样网站www.xyz.com就不再要求所述用户的凭证。

这项工作需要什么? 我对此有一些限制,用户数据库是完全独立的,它不是组织内部的,在所有方面,它就像从stackoverflow.com传递到google进行身份validation,它本质上是独立的。 链接到相关文章就足够了。

尝试通过设置web.config身份validation部分来使用FormAuthentication,如下所示:

   

生成机器密钥。 示例: 生成MachineKey的最简单方法 – 提示和技巧:ASP.NET,IIS …

发布到其他应用程序时,身份validation票证将作为隐藏字段传递。 在从第一个应用程序阅读post时,第二个应用程序将读取加密的票证并对用户进行身份validation。 以下是传递该字段的页面示例:

的.aspx:

 

后台代码:

 protected void Page_Load(object sender, EventArgs e) { FormsIdentity cIdentity = Page.User.Identity as FormsIdentity; if (cIdentity != null) { this.hdnStreetCred.ID = FormsAuthentication.FormsCookieName; this.hdnStreetCred.Value = FormsAuthentication.Encrypt(((FormsIdentity)User.Identity).Ticket); } } 

另请参阅Wrox 本书第5章中的跨应用程序表单身份validation部分。 除了提供自制SSO解决方案之外,它还推荐上述答案。

如果您使用的是内置成员资格系统,则可以使用表单auth进行跨子域身份validation,方法是在每个web.config中使用类似的方法。

    

确保所有web.configs中的名称,路径,保护和域名都相同。 如果站点位于不同的计算机上,则还需要确保machineKey以及validation和加密密钥相同。

如果在数据库中存储用户会话,则只需检查会话表中Guid的存在(如果存在),然后用户已在另一个域上进行了身份validation。 为此,当您将用户重定向到其他网站时,您必须在URL中包含会话guid。

不确定你用于.NET的是什么,但通常我会在LAMP堆栈中使用memcached 。

解决方案取决于应用程序的类型和运行环境。 例如,在具有NT域的Intranet上,您可以使用NTLM将Windows凭据直接传递到Intranet外围的服务器,而无需重复会话。

如何执行此操作的方法通常称为单点登录 (请参阅Wikipedia )。

此问题有多种方法,称为“跨域单点登录”。 如果您正在寻找开源解决方案,那么Matej指向的维基百科文章特别有用 – 但是 – 在Windows环境中我相信您最好使用以下两种方法之一:

  1. 购买商业SSO产品(如SiteMinder或PingIdentity)
  2. 使用MicroSoft的跨域SSO解决方案,称为ADFS – Active Direcctory Federation Services。 (联合是协调多个域行为的术语)

我使用过SiteMinder,效果很好,但价格昂贵。 如果您处于所有MicroSoft环境中,我认为ADFS是您最好的选择。 从本ADFS白皮书开始。

我会使用类似CAS的东西:

[1]: http : //www.ja-sig.org/products/cas/ CAS

这是一个已解决的问题,不建议您自己滚动。

或者,如果您想自己滚动并且相关站点不在同一台服务器上或者无法访问共享数据库(在这种情况下请参阅上述响应),那么您可以在每个站点上放置一个Web信标这会引用回到另一个网站。

在站点A上放置一个像素图像(Web信标),这将调用站点B通过用户ID(加密和时间戳)。 然后,这将在站点B上为用户创建新的用户会话,该用户会被设置为登录。然后当用户访问站点B时,他们已经登录。

要最小化呼叫,您只能将Web信号放在主页上,或者登录确认页面。 我过去曾成功使用此function在合作伙伴网站之间传递信息。