我有一个域http://abc.com和一个子域名http://sub.abc.com.我通过共享表单身份验证cookie来实现两个站点之间的单一登录.这通过使两个站点在machineKey中共享validationKey和decryptKey来实现.
当用户点击子域中的页面时,我希望用户在根域中进行身份验证,并重定向到子域.用户当前被重定向到登录页面,但是ReturnUrl想要重定向到根站点.
例如.目前:http://abc.com/login.aspx?ReturnUrl=/secure/default.aspx
但我想要:http://abc.com/login.aspx?ReturnUrl=http://sub.abc.com/secure/default.aspx
怎么可以实现?
在我的子域名的web.config中,我有一个这样配置的auth:
<authentication mode="Forms"> <forms name=".ASPNET" loginUrl="http://abc.com/login.aspx" protection="All" timeout="1440" path="/" domain="abc.com" enableCrossAppRedirects="true" /> </authentication>
解决方法
我通过在我的子域中的表单元素中设置一个querystring来解决这个问题:
<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来构建重定向网址.
返回网站的查询字符串真的只是作为一个标志,我需要重定向到一个已知的子域,否则它将只与重定向到当前域.这应该(理论上)阻止跨站脚本.