【发布时间】:2014-05-20 11:34:47
【问题描述】:
如果用户登录与否,我们不能只存储在会话中并摆脱 .ASPXAUTH 吗?
【问题讨论】:
标签: asp.net asp.net-mvc-3 asp.net-mvc-4 asp-classic
如果用户登录与否,我们不能只存储在会话中并摆脱 .ASPXAUTH 吗?
【问题讨论】:
标签: asp.net asp.net-mvc-3 asp.net-mvc-4 asp-classic
ASP.Net_SessionId 是一个cookie,用于在服务器上识别用户session。会话是服务器上的一个区域,可用于在 http 请求之间存储数据。
例如,控制器动作可能会执行:
Session["FirstName"] = model.FirstName;
然后,在后续操作中,可以从会话中检索名字:
var firstName = Session["FirstName"];
ASP.Net_SessionId 标识用户请求的会话。不同的用户将提交不同的 cookie,因此Session["FirstName"] 将为不同的用户保存不同的值。
ASPXAUTH 是一个 cookie,用于识别用户是否为 authenticated(即是否已验证其身份)。例如,控制器操作可以确定用户是否提供了正确的登录凭据,如果是,则发出身份验证 cookie using:
FormsAuthentication.SetAuthCookie(username, false);
然后您可以使用[Authorize] 属性检查用户是否有权执行某项操作,该属性检查ASPXAUTH cookie 的存在。
因此,总而言之,cookie 有两个不同的目的。一种用于确定用户会话状态,一种用于确定用户是否经过身份验证。
要完成您的问题的答案,是的,您可以去掉ASPXAUTH cookie,只使用会话来识别用户(我在较旧的经典 asp 应用程序中看到过这样做)但我不推荐它.更好地分离关注点并在必要时使用适当的方法。会话和身份验证将设置自己的超时值。通过使用会话进行身份验证,您将只有一次超时。我不确定仅使用会话进行身份验证是否存在任何安全隐患,但我仍然会将它们分开。
【讨论】:
.NET 发出一个完全不同的 cookie,名为 ASP.NET_SessionId,用于跟踪会话状态。
ASPXAUTH cookie 用于确定用户是否经过身份验证。
所以这是两个不同的概念,即会话状态管理和使用表单身份验证的身份验证管理。
如果您使用 Session 进行身份验证而忘记了表单身份验证,您将摆脱 .ASPXAUTH
【讨论】:
两者都是必需的,使用任何一个都会导致以下漏洞:
*ASP.NET_SessionId 单独:会话固定
*Forms Authentication Cookie Alone: Can't Terminate Authentication Token on the server
另外,您需要确保它们正确耦合在一起。否则,配置也会带来风险:
*松散耦合的 ASP.NET_SessionID 和表单身份验证 Cookie:仍然存在漏洞
参考: http://blog.securityps.com/2013/06/session-fixation-forms-authentication.html
【讨论】:
会话状态和身份验证彼此无关。您可以使用一个而不使用另一个。
【讨论】: