0

在自定义 ActionFilterAttribute 的 OnActionExecuting 方法期间,我们确保用户在执行某些操作之前仍处于登录状态。我们通过执行类似于此伪代码的操作来做到这一点:

public override void OnActionExecuting( ActionExecutingContext filterContext )
{
    if ( filterContext.HttpContext.User.Identity.IsAuthenticated )
    {
        // Do something...
    }
}

我有多个站点,用于在同一域下运行的多个客户端,唯一的区别是虚拟目录名称。每个虚拟目录实际上都指向相同的文件夹/代码库,并且 URL/virdir 名称指示要使用嵌套 /Clients 目录中的“客户端配置文件”的代码。不确定是否需要站点/代码/IIS 配置中的那么多细节,但提供以防万一是问题的罪魁祸首。

如果我尝试使用浏览器的多个实例登录多个站点,一切正常。当我尝试在站点中导航时,IsAuthenticated 检查返回 true。

但是,如果我尝试使用具有多个选项卡的单个浏览器登录多个站点,我会不断地来回注销。如果我登录到站点 A,我可以四处导航,但是一旦我登录到站点 B,如果我尝试在站点 A 中的任何位置导航,IsAuthenticated 就会返回 false。

这是预期的行为吗?有解决方法吗?

更新:我现在只能在 IE 中重现这种行为。在 Firefox 和 Chrome 中,无论我在同一个浏览器/多个选项卡还是多个浏览器上,我都会被引导到登录屏幕。IE 处理 cookie 的方式有区别吗?还是饼干不是罪魁祸首?

4

1 回答 1

0

在不详细了解您的设置的情况下,这就是我所期望的。

假设:

  1. 您声明您有多个虚拟目录指向一个代码库。
  2. 这些虚拟目录中的每一个都最有可能设置为应用程序是 IIS。
  3. 您没有在 web.config 中定义机器密钥,因此,每个虚拟目录都会自动生成自己的加密/解密密钥

可能发生了什么:

  1. 当您从不同的浏览器登录时,每个浏览器都会获得一个身份验证 cookie。由于您使用不同的浏览器,因此没有问题。
  2. 使用同一浏览器时,您登录到站点 A 并获得一个加密的 cookie,该 cookie 使用站点 A 自动生成的密钥加密。
  3. 当您尝试转到另一个具有不同自动生成的机器密钥的虚拟目录时,站点无法读取身份验证票证(无法解密)并因此返回已登录 = false。
  4. 登录到站点 B 后,身份验证 cookie 将替换为来自站点 B 的身份验证票。此时,siteA 无法再解密身份验证票据并返回已登录=false。

尝试使用适当的选项( machineKey element 上的 MSDN )设置 web.config 的机器密钥配置部分。 以下是有关表单身份验证票证和流程的更多信息

于 2012-07-26T02:33:19.970 回答