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

时间:2008-09-16 13:25:10

标签: c# asp.net asp.net-membership membership

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

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

然后,从该网站,他们被发送到(重定向,链接,无论有效)网站www.xyz.com,网站www.abc.com的意图是将该用户传递到其他网站作为状态isAuthenticated,以便网站www.xyz.com不再要求所述用户的凭证。

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

8 个答案:

答案 0 :(得分:5)

尝试使用FormAuthentication,方法是设置web.config身份验证部分,如下所示:

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

生成机器密钥。示例:Easiest way to generate MachineKey – Tips and tricks: 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的此book第5章中的跨应用程序表单身份验证部分。除了提供自制SSO解决方案之外,它还推荐上述答案。

答案 1 :(得分:2)

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

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

</authentication>

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

不确定您使用的是什么,但通常我会在LAMP堆栈中使用memcached

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

  1. 购买商业SSO产品(如SiteMinder或PingIdentity)
  2. 使用MicroSoft的跨域SSO解决方案,称为ADFS - Active Direcctory Federation Services。 (联合是协调多个域的行为的术语)
  3. 我使用过SiteMinder,效果很好,但价格昂贵。如果您处于所有MicroSoft环境中,我认为ADFS是您最好的选择。从这个ADFS whitepaper开始。

答案 6 :(得分:0)

我会使用类似CAS的东西:

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

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

答案 7 :(得分:-1)

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

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

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