在子域上验证用户并保持在父域中登录?

时间:2015-08-30 12:40:16

标签: c# asp.net-mvc-4 cookies forms-authentication

我有两个网站: www.forums.mysite.com 和www.mysite.com

论坛已经设置了身份验证,我想使用它。

我正在使用C#MVC .NET 4.5

我在IIS 8.5中创建了两个站点:mysite和论坛

mysite绑定:

  • 类型:HTTP
  • IP地址:全部未签名
  • 港口:80
  • 主持人姓名:www.mysite.com

论坛绑定:

  • 类型:HTTP
  • IP地址:全部未签名
  • 港口:80
  • 主机名:www.forums.mysite.com

我还将域名添加到主机文件

  • myip www.mysite.com
  • myip www.forums.mysite.com

我已将MachineKey添加到两个应用程序Web.config文件中,并且键是相同的:

<machineKey validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" validation="SHA1" />

在子域(论坛)的控制器中,用户登录并修改了cookie,如下所示:

FormsAuthentication.SetAuthCookie(username, model.RememberMe);
var cookie = FormsAuthentication.GetAuthCookie(username, model.RememberMe);
cookie.Domain = "mysite.com"; //this is the parent domain
//I've also tried with .mysite.com
Response.AppendCookie(cookie);

我可以通过论坛登录,但是当我访问主站点(mysite.com)时,我还没有登录...我不明白为什么不这样做。

作为mysite.com/home/index.cshtml(主页)中的测试,我添加了这个:

<h1>
  Logged in:  @User.Identity.IsAuthenticated
</h1>

但结果始终为false,即使两个站点都具有相同的.ASPXAUTH cookie ...

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

域名可能是.mysite.com(前导点),而不是mysite.com

<强> UPD。

此外,问题可能出在您的域名中的前导www。尝试将Cookie域设置为www.mysite.com.www.mysite.com(或在您的配置中删除www,这只是一个古老的垃圾:))

<强> UPD。 2

看起来为父域设置cookie存在问题(例如,请查看this),从某些角度来看,这是可以理解的。

只能建议:

  1. 在子域中进行用户登录时,请获取身份验证数据。
  2. 序列化身份验证数据并将其发送到父域,以及www.mysite.com/keep-logined?c=<encoded_auth_data>
  3. 等脚本
  4. keep-logined脚本中反序列化auth数据并手动设置根域的cookie。
  5. 将用户重定向回子域,(可以使用keep-logined网址提供redirect-back脚本。
  6. 注意:请确保通过某种编码或密钥传递保护keep-logined脚本并通过黑客攻击提供auth数据。

相关问题