我用MVC4创建了我的第一个超级小型webapp。到目前为止,我使用布局的东西来布局webapp并添加了一些视图控制器和模型来注册并允许用户登录。
用户登录/注册后,我将其用户名存储在会话中。我从会话中读取此属性以确定用户是否已登录。
这是一种不好的做法吗?我读了很多关于RESTful和无状态webapps的内容。我觉得我不应该在会议中保存任何东西。
e.g。
@if (string.IsNullOrEmpty(Session["User"] as string))
{
<dl>
<dt><a href="/Account/Register">Register</a></dt>
<dt><a href="/Account/Login">Login</a></dt>
</dl>
}
else
{
<dl>
<dt><a href="/Account/ShowAccount/@Session["User"]">@Session["User"]</a></dt>
<dt><a href="/Account/Logout">Log out</a></dt>
</dl>
}
Q1:这是一种不好的做法吗?
Q2:这是“黑客安全”吗?那么,是否很容易破解当前会话并在Session [“User”]中存储一个值以绕过登录?
答案 0 :(得分:7)
回答你的问题:
1)一般情况下,使用会话状态并不是不好的做法,只要您需要它用于您的应用程序并且您了解它对性能和可伸缩性的影响。但是,在您的情况下,如果您需要存储的只是用户的名称,那么您真的不需要它,如果您的应用程序使用的是ASP.Net成员资格提供程序,那么此信息可在MVCController的User属性中找到基类:
var username = User.Identity.Name
可以存储会话数据的三种方式:“InProc”,它存储在应用程序进程中,“StateServer”,它存储在单独服务器上的输出进程,以及“SQLServer”,它位于存储在SQL Server数据库中。您应该使用哪一个取决于您是否正在使用服务器场,如果您的会话需要持久(即在机器重启后仍然存在),以及您的应用程序的性能要求是什么(StateServer和SQLServer的性能不如InProc)。可以找到更多信息here
2)您应该使用SSL来保护会话数据。通过SSL(HTTPS)发送的数据是完全加密的,包括标头(因此是cookie)。关于如何防止会话劫持攻击的一个很好的讨论是found here.