Asp.net 表单身份验证返回单一登录的URL和子域

Asp.net 表单身份验证返回单一登录的URL和子域,asp.net,forms-authentication,subdomain,single-sign-on,Asp.net,Forms Authentication,Subdomain,Single Sign On,我有一个域名http://abc.com和一个子域http://sub.abc.com。我正在通过共享表单验证cookie实现两个站点之间的单点登录。这是通过让两个站点在machineKey中共享validationKey和decryptionKey来实现的 当用户点击子域中的页面时,我希望用户在根域中进行身份验证并重定向回子域。用户当前被重定向到登录页面,但ReturnUrl希望重定向到根站点 目前:http://abc.com/login.aspx?ReturnUrl=%2fsecure%2

我有一个域名
http://abc.com
和一个子域
http://sub.abc.com
。我正在通过共享表单验证cookie实现两个站点之间的单点登录。这是通过让两个站点在machineKey中共享validationKey和decryptionKey来实现的

当用户点击子域中的页面时,我希望用户在根域中进行身份验证并重定向回子域。用户当前被重定向到登录页面,但ReturnUrl希望重定向到根站点

目前:
http://abc.com/login.aspx?ReturnUrl=%2fsecure%2fdefault.aspx

但是我想要:
http://abc.com/login.aspx?ReturnUrl=http:%2f%2fsub.abc.com%2fsecure%2fdefault.aspx

如何做到这一点

在我的子域的web.config中,我当前的身份验证配置如下:

<authentication mode="Forms">
  <forms name=".ASPNET" loginUrl="http://abc.com/login.aspx" protection="All" timeout="1440" path="/" domain="abc.com" enableCrossAppRedirects="true" />
</authentication>

您可以通过在查询字符串中传递身份验证票证来解决此问题 参数,而不是在cookie中。

更新
现在查看此链接


更新

您也可以使用FormsAuthentication.GetRedirectUrl方法

看看

我通过在我的子域中的“我的表单”元素中设置查询字符串解决了这个问题:

<authentication mode="Forms">
    <forms name=".ASPNET" loginUrl="http://abc.com/login.aspx?returnsite=sub" protection="All" timeout="1440" path="/" domain="abc.com" enableCrossAppRedirects="true" />
</authentication>

然后在我的主网站中的身份验证代码中,我检查该查询字符串。如果它存在,我通过将我的子域附加到returnurl来构建重定向url


returnsite querystring实际上只是作为一个标志,我需要重定向到一个已知的子域,否则它将只使用重定向到当前域的URL。这(理论上)可以防止跨站点脚本编写。

如果您希望sub.abc.com可以访问来自abc.com的cookies,我相信您需要将域设置为“.abc.com”,而不仅仅是“abc.com”。不过,我不太清楚返回URL的事情。您可能需要通过检查UrlReferer手动执行此操作。您不需要为域使用*.abc.com之类的通配符吗?@Daniel Schaffer,我需要在两个站点的配置中设置“.abc.com”吗?还是仅仅是子域的?@Gallen,带着cookies,这个。域之前是通配符@是的,我相信你需要在两个网站上都这么做。公平警告-我已经使用了FormsAuthentication,并且我已经在子域之间共享cookie,但不是同时在两个子域之间共享cookie。我在这里主要是猜测,这就是为什么我使用评论而不是答案。关于域属性,我在帖子中使用的方式也适用于所有子域。不需要“.abc.com”或“*.abc.com”。这看起来有点乱。如果cookie的值在其中,查询字符串可能会变得非常长。我的问题并不是真正的cookie,尽管我已经设法在域之间共享了cookie。这只是为了让ReturnURL查询字符串正确无误。好的,现在看看这个链接,它是一个很好的单点登录阅读,但它没有回答我关于ReturnURL的问题。你也可以使用FormsAuthentication.GetRedirectUrl方法我比其他解决方案更喜欢它,因为它没有公开重定向到的通用方法未经授权的位置,是网络钓鱼攻击的主要工具。