背景 如果愿意,跳过
我正在使用.NET(4.5.2)Web应用程序,该应用程序使用由OWIN中间件提供的CookieAuthentication和OpenIdConnectAuthentication(与Azure AD集成)。
来自客户端的渗透测试突出表明,即使在用户注销后,该cookie仍然是授权的,因此可以用来提交请求。这是预期的行为,但我需要找到解决方法。
我正在尝试在此related post中实施解决方法,即使用SecurityStampValidator.OnValidateIdentity
方法和调用UserManager.UpdateSecurityStampAsync
来使注销时有效地使cookie无效。
代码 可以根据要求提供更多信息
我在CookieAuthenticationProvider
方法中添加了OnValidateIdentity
和ConfigureAuth
:
app.UseCookieAuthentication(new CookieAuthenticationOptions {
CookieName = "whatever",
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(1),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)
),
},
});
我还按照this helpful post将UseTokenLifetime = false
添加到了OpenIdConnectAuthenticationOptions中。
我计划在退出过程中添加UserManager.UpdateSecurityStampAsync(User.Identity.GetUserId());
,但是我还没有进行测试。
如果相关,这是我登录的发起人:
Request.GetOwinContext().Authentication.Challenge(
new AuthenticationProperties { RedirectUri = Request.ApplicationPath },
OpenIdConnectAuthenticationDefaults.AuthenticationType);
我的期望
由于不应该更改SecurityStamp,因此validateInterval
(1分钟)后,所有内容都应继续正常运行(用户现有的cookie仍然有效)。
结果
登录后1分钟后的第一个请求导致返回以下set-cookie响应标头:
whatever =;路径= /; expires =星期四,格林尼治标准时间1970年1月1日00:00:00
因此,用户的cookie被删除并被注销。
问题
我的期望是正确的,还是我误解了validateInterval
?有什么方法可以让我按上述要求工作?创建初始cookie之后,是否有可能在登录过程中某个地方更改了SecurityStamp,而我却没有意识到?