【问题标题】:ASP.NET MVC4 Session state store usernameASP.NET MVC4 会话状态存储用户名
【发布时间】:2012-12-13 21:56:15
【问题描述】:

我用 MVC4 创建了我的第一个超级小型 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"] 中存储一个值以绕过登录是否容易?

【问题讨论】:

  • 为什么不直接使用内置的 ASP.NET 成员资格功能来检查用户是否已经登录?
  • 我想我忘了强调我有点新的事实:)。到目前为止学到了很多东西,但还没有遇到过那部分。我会检查一下,但在问题的答案后仍然很好奇。我敢打赌,我以后会发现需要在会话中存储东西,我想知道我是否可以按照上面描述的方式使用它而不会出现任何问题。

标签: asp.net asp.net-mvc session


【解决方案1】:

回答您的问题:

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.

【讨论】:

  • 谢谢你们一百万!我现在几乎有一个工作应用程序:)
猜你喜欢
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 2010-11-02
相关资源
最近更新 更多