【问题标题】:Asp.Net appears to drop the FormsAuthenticationCookie in same domainAsp.Net 似乎在同一域中删除 FormsAuthentication Cookie
【发布时间】:2012-01-11 19:29:04
【问题描述】:

我在 Asp.Net 中建立了两个网站。在开发中,它们都在我的机器上。一个托管在 IIS 中,一个托管在 IISExpress 中。我已将两个网站都配置为使用 FormsAuthentication,并在每个 web.config 中设置相同的身份验证和 httpCookies 元素:

<authentication mode="Forms">
  <forms loginUrl="~/LogOn" timeout="2880" domain=".mydomain"  />
</authentication>

<httpCookies domain=".mydomain" requireSSL="false"/>

但是,在标准 FormsAuthentication.SetAuthCookie 之后,第二个站点无法从第一个站点读取 .ASPXAUTH cookie。它可以从其他网站读取相同的 Asp.Net_SessionID cookie。因此,一个 cookie 正在跨应用程序传递,但第二个没有。

此外,当调试器附加到第二个应用程序并从第一个站点接收重定向时,Chrome 调试器会显示两个 cookie,Fiddler 报告两个 cookie 都已传输,并且 Response.Headers["cookie' ] 包含 .ASPXAUTH cookie。

如何实现这种跨应用程序登录?在生产中,这两个站点将在不同的子域上回答。

【问题讨论】:

  • 你的场景不太清楚。您说一个站点托管在 IIS 上,另一个站点托管在 IISExpress 上。但是那些网络服务器不能监听同一个端口,对吧?所以你在http://mydomain:80 和另一个在http://mydomain:8080 上,对吗?在这种情况下,您根本无法共享任何 cookie,因为您违反了同源政策。
  • 不不...实际上他们正在共享 Asp.Net_SessionID cookie。我可以从第二个站点看到这一点,并且可以访问会话的内容。 FormsAuthenticationTicket 没有被传递,即使它被标记为域 cookie
  • 您使用的是进程外会话提供程序吗?您如何在当然是不同进程的 2 个不同 ASP.NET 应用程序之间共享会话信息?
  • 啊是的...我使用 SqlServer 作为我的会话提供程序。因此,从一个站点传递(在 cookie 中)到另一个站点的 SessionId 使会话的内容能够显示。我不明白为什么没有通过 FormsAuthenticationTicket ".ASPXAUTH",但是 SessionId 是......
  • 我也看过 MSDN 文章:msdn.microsoft.com/en-us/library/eb0zx8fc.aspx 并没有发现太多运气

标签: asp.net cookies


【解决方案1】:

我找到了问题的答案。

IISExpress 和 IIS 使用不同的 MachineKey 值,即使它们源自同一台物理机器。为了解决我的问题,我在 http://aspnetresources.com/tools/machineKey 处生成了一个 MachineKey 条目,并将相同的 MachineKey 元素放入所有参与的应用程序的 web.config 文件中。

感谢 Twitter 上的 Robert Smith @smithrobs 建议我检查这行问题。

【讨论】:

    猜你喜欢
    • 2013-02-19
    • 2015-05-13
    • 1970-01-01
    • 2016-07-09
    • 2014-08-03
    • 2012-05-19
    • 2010-10-07
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多