问题是,如果用户闲置时间超过2分钟,然后单击“注销”按钮,则站点无法将其注销.经过一番调查,我发现在这些情况下,服务器返回一个新的应用程序cookie(发送到服务器的cookie与从它返回的cookie不同).似乎正在发生的事情是,owin代码错过了对AuthenticationManager.SignOut的调用,并继续生成新的应用程序cookie,正如通常在旧的应用程序cookie超过两分钟的情况下一样.
还有其他人遇到过这个问题吗?有关如何诊断和修复的任何建议?
我使用的是VS 2013 Update 3,但此问题与先前版本的Identity一起存在.
更新:
作为一个实验,我使用VS 2013 Update 3模板创建了一个全新的ASP.NET Web应用程序项目并注意到完全相同的问题:我登录后等待了一段时间等于安全标记validateInterval(默认情况下,30分钟).之后我点击了Log Off链接并注意到,就像在我自己的项目中一样,a)我没有注销,并且b)向我发出了一个新的安全标记cookie.我必须再次点击该链接才能注销.事实上,我甚至不需要闲置30分钟:我可以在此期间继续发出请求,只要是30分钟间隔后的第一个请求,点击退出按钮仍然会失败过期.
这似乎是OWIN身份代码中的一个错误.基本上,如果验证间隔之后的第一个请求是注销请求,则它会失败,因为验证并发出新安全戳的代码不会检查用户是否已作为同一请求的一部分注销.注销请求将失败,只要它们是导致重新发布安全标记的请求的一部分 – 即自发布先前安全标记以来在validationInterval分钟之后的第一个请求.
如果有人能证实这种行为,我将不胜感激.您不必等待30分钟,也不必创建新项目.只需使用一个使用Identity的现有项目,暂时将验证间隔设置为非常短(30秒或一分钟),登录,并确保间隔到期后的第一个请求是单击logout按钮.如果这是一个错误,您应该注意到您仍然登录.
解决方法
我通过更改AuthenticationManager.SignOut来解决此问题,以指定身份验证类型,如下所示:
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie,DefaultAuthenticationTypes.ExternalCookie);
此外,您的OWIN组件应该是3.0.0版本(因为您使用的是Identity 2.1.0,所以应该是这种情况)