gpt4 book ai didi

asp.net-mvc - 使旧 session Cookie 无效 - ASP.Net 身份

转载 作者:行者123 更新时间:2023-12-03 11:43:27 24 4
gpt4 key购买 nike

一家外部公司对我正在开发的 ASP.NET MVC 5 应用程序进行了一些渗透测试。

他们提出的一个问题描述如下

A cookie linked with session Management is called AspNet.ApplicationCookie. When entered manually,the application authenticates the user. Even though the user logs out from the Application,the cookie is still valid. This means,the old session cookie can be used for a valid authentication within unlimited timeframe. In the moment the old value is inserted, the application accepts it and replaces it with a newly generated cookie. Therefore, if the attacker gains access to one of the existing cookies, the valid session will be created,with the same access as in the past.



我们正在使用 ASP.NET Identity 2.2

这是我们在帐户 Controller 上的注销操作
 [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
AuthenticationManager.SignOut();
return RedirectToAction("Login", "Account");
}

在startup.auth.cs
 app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
ExpireTimeSpan = TimeSpan.FromHours(24.0),
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, int>(
validateInterval: TimeSpan.FromMinutes(1.0),
regenerateIdentityCallback: (manager, user) =>
user.GenerateUserIdentityAsync(manager),
getUserIdCallback: (id) => (Int32.Parse(id.GetUserId())))

}
});

我原以为该框架会处理使旧 session cookie 失效的问题,但浏览 Owin.Security 源代码似乎没有。

如何在注销时使 session cookie 无效?

编辑 Jamie Dunstan我添加的建议 AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);但没有任何区别。我仍然可以退出应用程序,在 Fiddler 中克隆先前经过身份验证的请求,并使其被应用程序接受。

编辑:我更新的注销方法
 [HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> LogOff()
{
var user = await UserManager.FindByNameAsync(User.Identity.Name);

AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
await UserManager.UpdateSecurityStampAsync(user.Id);

return RedirectToAction("Login", "Account");
}

最佳答案

确保您使用 AuthenticationManager.Signout(DefaultAuthenticationTypes.ApplicationCookie);正如杰米正确建议的那样。

能够再次使用相同的 cookie 登录是设计使然。 Identity 不会创建内部 session 来跟踪所有登录的用户,如果 OWIN 获得命中所有框的 cookie(即来自前一个 session 的副本),它会让您登录。

如果您在更新安全戳后仍然可以登录,很可能 OWIN 无法获取 ApplicationUserManager .确保您在 app.UseCookieAuthentication 上方有这条线

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

或者,如果您正在使用 DI,请使用 ApplicationUserManager来自 DI:
app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>());

也减少了 validateInterval: TimeSpan.FromMinutes(30)降低值(value) - 我通常会花几分钟的时间。这是 Identity 将 auth-cookie 中的值与数据库中的值进行比较的频率。比较完成后,Identity 会重新生成 cookie 以更新时间戳。

关于asp.net-mvc - 使旧 session Cookie 无效 - ASP.Net 身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34020730/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com