如何在应用程序域之间传递经过身份验证的会话

时间:2020-03-05 18:55:54  来源:igfitidea点击:

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

假设用户访问www.abc.com,并且他们通过普通的ASP .NET成员资格提供程序进行了身份验证。

然后,他们从该站点被发送到(重定向,链接,无论工作如何)站点www.xyz.com,站点www.abc.com的目的是将该用户作为isAuthenticated状态传递给另一个站点,因此,www.xyz.com网站不会再次要求提供该用户的凭据。

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

解决方案

回答

不知道我们将为.NET使用什么,但是通常我会在LAMP堆栈中使用memcached。

回答

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

这样做的方法通常称为单点登录(请参阅Wikipedia)。

回答

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

回答

如果我们使用内置的成员资格系统,则可以通过在每个web.config中使用类似的形式使用表单auth进行跨子域身份验证。

<authentication mode="Forms">
    <forms name=".ASPXAUTH" loginUrl="~/Login.aspx" path="/" 
                  protection="All" 
                  domain="datasharp.co.uk" 
                  enableCrossAppRedirects="true" />

</authentication>

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

回答

有多种解决此问题的方法,称为"跨域单点登录"。如果我们正在寻找开放源代码解决方案,那么Matej指出的Wikipedia文章特别有用,但是在Windows环境中,我相信我们最好使用以下两种方法之一:

  • 购买商业SSO产品(例如SiteMinder或者PingIdentity)
  • 使用MicroSoft的跨域SSO解决方案,称为ADFS-Active Direcctory Federation Services。 (联邦是用于协调多个域的行为的术语)

我已经使用过SiteMinder,并且效果很好,但价格昂贵。如果我们在全MicroSoft环境中,我认为ADFS是最佳选择。从此ADFS白皮书开始。

回答

或者,如果我们要自己滚动,并且所讨论的站点不在同一服务器上或者无法访问共享数据库(在这种情况下,请参见上面的响应),则可以在每个站点上放置一个网络信标这将返回到另一个站点。

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

为了最大程度地减少呼叫,我们只能将Web信标放置在主页上或者登录确认页面。过去,我已经成功地使用了此功能,以便在合作伙伴站点之间传递信息。

回答

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

<authentication mode="Forms">
  <forms name=".ASPXAUTH" requireSSL="true" 
      protection="All" 
      enableCrossAppRedirects="true" />
</authentication>

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

在发布到另一个应用程序时,身份验证票证将作为隐藏字段传递。从第一个应用程序读取帖子时,第二个应用程序将读取加密的票证并验证用户身份。这是传递字段的传递页面的示例:

.aspx:

<form id="form1" runat="server">
  <div>
    <p><asp:Button ID="btnTransfer" runat="server" Text="Go" PostBackUrl="http://otherapp/" /></p>
    <input id="hdnStreetCred" runat="server" type="hidden" />
  </div>
</form>

后台代码:

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章中的跨应用程序表单身份验证部分。除了提供自制SSO解决方案外,它还建议类似上述的答案。

回答

我会使用类似CAS的名称:

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

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