我在C#中有一个项目,它在登录屏幕后面有一些管理功能。
在最近的一次测试中,我们被发现可能会受到攻击:如果用户提交表单,注销,并且重复发布表单(使用打嗝或类似工具),服务器仍然会将其视为登录状态回答正确。
整个'管理员'控制器设置为[Authorize]
并设置了适当的角色。注销时,我正在打电话
FormsService.SignOut();
Session.Clear();
Session.Abandon();
并将用户重定向到起始页。
我读过的所有内容都表明,这应该是我需要做的就是防止这种情况发生。那就是说,我可以做到以下几点:
我该怎么做才能防止这种情况发生?
答案 0 :(得分:0)
经过更多的实验,我找到了解决方案!
当用户登录时,我会执行以下操作:
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application[HttpContext.User.Identity.Name] = true;
System.Web.HttpContext.Current.Application.UnLock();
我在用户注销时将其反转(在杀死Session之前可以将它们从FormsService中签名)。
然后,我利用了这样一个事实:我们已经有custom AuthorizeAttribute override来执行“OnAuthorization'方法:
/* Some other customer stuff that isn't relevant */
base.OnAuthorization(filterContext);
if (System.Web.HttpContext.Current.Application[filterContext.HttpContext.User.Identity.Name] != null &&
((bool)System.Web.HttpContext.Current.Application[filterContext.HttpContext.User.Identity.Name]) == true)
{
//The user is ok to log in, and should be validated now.
}
else
{
HandleUnauthorizedRequest(filterContext);
}
通过将用户的登录状态存储在应用程序状态,我可以确认他们的登录状态。
有些人似乎认为静态类比访问MVC中的应用程序状态更好,但在这种情况下应用程序对我来说更好(主要是因为对于维护代码的其他人来说更熟悉并且为了便于单元测试。)