9

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

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

然后,从该站点,它们被发送到(重定向、链接、任何工作)站点 www.xyz.com,站点 www.abc.com 的目的是将该用户作为 isAuthenticated 状态传递到另一个站点,这样网站 www.xyz.com 就不会再次要求该用户的凭据。

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

4

8 回答 8

5

尝试通过设置 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 解决方案外,它还推荐与上述类似的答案。

于 2008-09-16T14:41:42.460 回答
2

如果您使用的是内置的会员系统,您可以通过在每个 web.config 中使用类似这样的方式使用表单身份验证进行跨子域身份验证。

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

</authentication>

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

于 2008-09-16T13:56:05.050 回答
1

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

于 2008-09-16T13:40:47.957 回答
0

不确定您将用于 .NET 的内容,但通常我会在 LAMP 堆栈中使用memcached 。

于 2008-09-16T13:27:47.020 回答
0

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

如何做到这一点的方法通常称为单点登录(参见Wikipedia)。

于 2008-09-16T13:39:14.887 回答
0

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

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

我使用过 SiteMinder,它运行良好,但价格昂贵。如果您处于全 MicroSoft 环境中,我认为 ADFS 是您最好的选择。从这份ADFS 白皮书开始。

于 2008-09-16T14:10:01.537 回答
0

我会使用 CAS 之类的东西:

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

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

于 2008-09-16T14:45:19.487 回答
-1

或者,如果您想推出自己的网站并且有问题的网站不在同一台服务器上或无法访问共享数据库(在这种情况下,请参阅上述回复),那么您可以在每个网站上放置一个网络信标这将引用到另一个站点。

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

为了尽量减少通话,您只能将网络信标放在主页上和/或登录确认页面。我过去曾成功地使用它在合作伙伴站点之间传递信息。

于 2008-09-16T14:26:25.680 回答