我有一个使用 MVC5 和 Aspnet Identity(本地帐户 + 基于 cookie 的身份验证)制作的完全可用的 Web 应用程序。我们对该站点进行了安全审计,结果表明我们的站点容易受到会话劫持。重现漏洞的步骤如下:
1 使用有效用户登录 2 从请求中复制 cookie 值 3 注销 4 请求任何受保护的页面,将复制的 cookie 添加到请求标头
即使浏览器删除浏览器中的 cookie 并成功注销用户,COOKIE 值仍然有效。换句话说,我们客户的安全部门要求的是使 COOKIE 无效的服务器端。
到目前为止,我尝试在注销控制器中更改 cookie 的安全标记,但 cookie 仍然有效。
这是我的身份验证配置,设置为在初始登录后 24 小时使令牌过期
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromDays(1),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
这是我的注销控制器
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
string userId = User.Identity.GetUserId();
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
UserManager.UpdateSecurityStampAsync(userId);
return RedirectToAction("Index", "Home");
}
现在,结果是一样的:在用户注销后,任何人都可以使用 cookie 来模拟原始登录用户。
我期望完成的是注销并使特定的 cookie 值成为无效的服务器端,以便在注销后没有人可以使用它。如果用户没有明确注销,则该 cookie 应在 1 天后失效。