【问题标题】:Application loses authentication when performing redirect to a virtual directory执行重定向到虚拟目录时应用程序丢失身份验证
【发布时间】:2010-05-03 17:27:25
【问题描述】:

我有以下设置: http://www.example.com/dir1/http://www.example.com/dir2/

每个虚拟目录在 IIS6.0 上都被配置为一个拥有自己 AppPool 的应用程序。

使用 response.redirect 将经过身份验证的用户从 dir1 重定向到 dir2 时,我丢失了用户的身份验证信息,并且用户被重定向到登录页面。在子域下配置的每个应用程序(dir1 和 dir2)都没有出现此问题,例如: http://dir1.example.comhttp://dir2.example.com

我已通过向 machine.config 文件添加机器密钥解决了该问题。

有人可以向我解释为什么它不适用于 http://www.example.com/dir1 配置吗?

【问题讨论】:

    标签: asp.net iis-6 asp.net-membership forms-authentication virtual-directory


    【解决方案1】:

    我经常以这种方式配置应用程序。有几个地方你可能会误入歧途。

    1. 每个 web.config 必须有一个通用 machineKey 部分的完全相同的副本。例如。生成一个部分并将其粘贴到您要与之共享 FormsTickets 的所有 web.configs 中。

    2. 每个 MembershipProvider(和 Roles/Profiles 等)元素必须共享相同的 applicationName 属性。默认情况下这是“/”,因此除非您手动更改它,否则应该没有问题。

    3. 所有应用程序中的所有提供程序都必须共享一个公共连接字符串到一个公共 aspnetdb 实例。

    4. 如果您单独或逐步尝试了这些步骤中的任何一个,则 DB 可能处于不一致的状态。确保满足所有这些要求并从新数据库开始。

    如果您按照这些步骤操作,您应该没有问题。这是一个相当常见且直接的用例。

    如果您还有其他问题,请告诉我。

    【讨论】:

    • 我了解这些步骤。我要问的是:为什么虚拟目录配置与虚拟主机配置需要共享通用机器密钥。
    【解决方案2】:

    我不知道 ASP,但我的猜测是您没有为正在使用的会话 cookie 指定路径,因此路径设置将默认为设置 cookie 的路径,@987654323 @ 和 /dir2,分别。

    在使用子域时,您可能使用example.com 作为主 cookie 域,因此两个子域都可以访问它 = 没问题。

    您应该能够通过检查浏览器中的会话 cookie 来发现这一点(例如,在 Firefox 的 Web Developer Toolbar 的“Cookies”选项卡中)。

    如果我是正确的,您将需要在某处指定 / 作为会话 cookie 的路径。

    我不知道在什么时候进行微调,但也许它会为你指明正确的方向。

    【讨论】:

    • +1 真好猜。但是...默认情况下,表单 cookie 路径是 /, msdn.microsoft.com/en-us/library/1d3t3c61.aspx 。除非 OP 明确指定不同的值并以自己的方式获得,否则还有其他事情发生。
    • @code 诗人好点和好链接。有兴趣看看结果如何。
    猜你喜欢
    • 2011-03-27
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多