在自定义ActionFilterAttribute的OnActionExecuting方法中,我们确保用户在执行某些操作之前仍然登录。我们通过做类似于这个伪代码的事情来做到这一点:
public override void OnActionExecuting( ActionExecutingContext filterContext )
{
if ( filterContext.HttpContext.User.Identity.IsAuthenticated )
{
// Do something...
}
}
我有多个站点,用于在同一域下运行的多个客户端,唯一的区别是虚拟目录名。每个虚拟目录实际上都指向相同的文件夹/代码库,URL/virdir名称向代码指示要使用嵌套/Clients目录中的"客户端配置文件"。不确定site/code/IIIS配置中是否需要那么多细节,但提供这些细节以防出现问题。
如果我尝试使用浏览器的多个实例登录多个网站,一切都很好。当我尝试在站点中导航时,IsAuthenticated检查返回true。
但是,如果我尝试使用带有多个选项卡的单个浏览器登录多个网站,我会不断地被注销。如果我登录到站点A,我可以四处导航,但一旦我登录到网站B,如果我试图在网站A中的任何地方导航,IsAuthenticated就会返回false。
这是预期的行为吗?有解决办法吗?
更新:我现在只能在IE中重现这种行为。在Firefox和Chrome中,无论我是在同一浏览器/多选项卡还是多浏览器上,我都会被引导到登录屏幕。IE处理cookie的方式有区别吗?还是饼干不是罪魁祸首?
在不了解您的设置细节的情况下,这就是我所期望的。
假设:
- 您声明有多个虚拟目录指向一个代码库
- 这些虚拟目录中的每一个都很可能被设置为应用程序是IIS
- web.config中没有定义计算机密钥,因此,每个虚拟目录都会自动生成自己的加密/解密密钥
可能发生的情况:
- 当您从不同的浏览器登录时,每个浏览器都会得到一个身份验证cookie。由于您使用不同的浏览器,因此没有问题
- 使用同一浏览器时,您登录到站点A,并获得一个加密的cookie,该cookie使用站点A自动生成的密钥加密
- 当您尝试转到另一个具有不同自动生成的计算机密钥的虚拟目录时,站点无法读取身份验证票证(无法解密),因此返回loggin=false
- 登录到站点B后,身份验证cookie将替换为站点B的身份验证票证。此时,siteA无法再解密身份验证票证,并返回loggin=false
尝试使用适当的选项(MSDN on machineKey元素)设置web.config的计算机密钥配置部分。以下是有关表单身份验证票证和过程以及的更多信息