asp.net-mvc - 如果不活动时间超过安全标记验证间隔,则 ASP.NET 身份注销失败

标签 asp.net-mvc asp.net-identity asp.net-identity-2

我的网站使用 ASP.Net MVC 5.2.2 和 ASP.Net Identity 2.1.0。在 CookieAuthenticationOptions 中,我将 ExpireTimeSpan 设置为 30 分钟,并将安全标记验证间隔设置为 2 分钟(这样用户将在调用 UserManager.UpdateSecurityStampAsync 的两分钟内被启动。

问题是,如果用户闲置超过 2 分钟,然后单击“注销”按钮,则站点无法将其注销。经过一番调查,我发现在这些情况下,服务器返回了一个新的应用程序 cookie(发送到服务器的 cookie 与从服务器返回的不同)。似乎正在发生的事情是,owin 代码错过了对 AuthenticationManager.SignOut 的调用,并继续生成新的应用程序 cookie,就像在旧的 cookie 超过两分钟的情况下通常那样。

有没有其他人遇到过这个问题?关于如何诊断和修复的任何建议?

我正在使用 VS 2013 Update 3,但以前版本的 Identity 中存在此问题。

更新:

作为一个实验,我使用 VS 2013 Update 3 模板创建了一个全新的 ASP.NET Web 应用程序项目,并注意到完全相同的问题:我登录然后等待与安全标记 validateInterval 相等的时间(默认情况下, 30分钟)。之后,我单击了注销链接并注意到,就像在我自己​​的项目中一样,a) 我没有注销,并且 b) 向我发出了一个新的安全标记 cookie。我必须再次单击该链接才能注销。事实上,我什至不需要闲置 30 分钟:在此期间我可以继续发出请求,但单击注销按钮仍然会失败,只要是 30 分钟间隔后的第一个请求已到期。

这似乎是 OWIN 身份代码中的一个错误。基本上,如果验证间隔之后的第一个请求是注销请求,它就会失败,因为验证和发布新安全标记的代码不会检查用户是否已作为同一请求的一部分注销。注销请求将失败,只要它们是会导致重新颁发安全标记的请求的一部分 - 即自发布上一个安全标记后的validationInterval 分钟后的第一个请求。

如果有人可以确认这种行为,我将不胜感激。您不必等待 30 分钟,也不必创建新项目。只需选择一个使用 Identity 的现有项目,将验证间隔临时设置为非常短的时间(30 秒或一分钟),登录,并确保间隔到期后的第一个请求是单击注销按钮。如果这是一个错误,您应该注意到您仍然处于登录状态。

最佳答案

我也遇到了同样的问题。
我通过更改我的 AuthenticationManager.SignOut 以指定身份验证类型来解决该问题,如下所示:

AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie, DefaultAuthenticationTypes.ExternalCookie);

此外,您的 OWIN 组件应该在 3.0.0 版本上(应该是这种情况,因为您使用的是 Identity 2.1.0)

关于asp.net-mvc - 如果不活动时间超过安全标记验证间隔,则 ASP.NET 身份注销失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25858776/

相关文章:

html - 提交按钮上的 Mailto

Ajax.BeginForm 用局部 View 替换整个页面

c# - WebApi + 简单注入(inject)器 + OWIN

c# - Identity 2.0.0 中的 ApplicationUser 和 ApplicationRole 导航属性

asp.net-identity - 陷入 Azure OAuth2 token 请求中的两个错误之间

security - MVC 5 安全措施

c# - 使用 C# WebClient 并获取异常时,如何在响应中显示可选字段?

javascript - 如何将 ajax.abort() 传播到 Controller

asp.net - 如何将我的 Autofac 容器插入 ASP。网络身份2.1

c# - 检查用户是否具有特定声明的角色