5

我用 MVC4 创建了我的第一个 uber 小型 webapp。到目前为止,我使用布局的东西来布局 webapp,并添加了一些视图控制器和模型来注册并允许用户登录。

一旦用户登录/注册,我将其用户名存储在会话中。我从会话中读取此属性以确定用户是否已登录。

这是一个坏习惯吗?我读了很多关于 RESTful 和无状态 webapps 的文章。我有点感觉我不应该在我的会话中保存任何东西。

例如

@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"] 中存储一个值以绕过登录是否容易?

4

1 回答 1

7

要回答您的问题:

1)一般来说,使用会话状态并不是一个坏习惯,只要您的应用程序需要它并且您了解它对性能和可伸缩性的影响。但是,在您的情况下,如果您只需要存储用户名,那么您真的不需要它,如果您的应用程序使用 ASP.Net 成员资格提供程序,那么此信息可在 MVCController 的 User 属性中获得基类:

var username = User.Identity.Name

可以通过三种方式存储会话数据:“InProc”,它存储在应用程序进程中,“StateServer”,它存储在单独的服务器上的输出进程,以及“SQLServer”,它存储在一个SQL 服务器数据库。您应该使用哪一个取决于您是否使用服务器场,您的会话是否需要持久(即在机器重新启动后仍然存在),以及您的应用程序的性能要求是什么(StateServer 和 SQLServer 的性能不如 InProc)。更多信息可以在这里找到

2) 您应该使用 SSL 来保护您的会话数据。通过 SSL (HTTPS) 发送的数据是完全加密的,包括标头(因此是 cookie)。关于如何防止会话劫持攻击的一个很好的讨论可以在这里找到。

于 2012-12-28T17:13:04.220 回答