ASP.NET MVC4会话状态存储用户名

5
我已经使用MVC4创建了我的第一个超级小型Web应用程序。到目前为止,我使用布局功能来布局Web应用程序,并添加了一些视图控制器和模型以注册并允许用户登录。
一旦用户登录/注册,我会将其用户名存储在会话中。我从会话中读取此属性以确定用户是否已登录。
这是一个不好的做法吗?我读了很多关于RESTful和无状态Web应用程序的文章。我有点感觉不应该在我的会话中保存任何内容。
例如:
@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>    
}

问题1:这是一种不好的做法吗?

问题2:这是否“安全可靠”?目前的会话易于被黑客攻击并存储一个值在Session["User"]中,以绕过登录吗?


4
为什么不直接使用内置的ASP.NET成员身份验证功能来检查用户是否已登录? - Greg Smith
我可能忘了强调一下我有点新手的事实 :). 到目前为止学到了很多东西,但还没有遇到那部分。我会去查看它,但仍然对问题的答案感到好奇。我打赌以后会发现需要在会话中存储东西,我想知道是否可以像上面描述的那样使用它而不会出现任何问题。 - bas
1个回答

7
回答你的问题:
1)一般来说,只要您需要它来支持您的应用程序并且您理解其对性能和可伸缩性的影响,使用会话状态并不是坏实践。然而,在您的情况下,如果您只需要存储用户的名称,那么您真的不需要它,如果您的应用程序正在使用ASP.Net成员资格提供程序,则此信息在MVCController基类中的User属性中可用:
var username = User.Identity.Name

有三种方式可以存储会话数据: "InProc",它存储在应用程序进程中;"StateServer",它将数据存储在单独的服务器上;"SQLServer",它将数据存储在 SQL Server 数据库中。你应该使用哪一种取决于你是否使用服务器集群,会话是否需要持久化(即在机器重启后仍然存在),以及你的应用程序性能要求是什么(StateServer 和 SQLServer 的性能比 InProc 差)。更多信息可以在这里找到。
2) 你应该使用 SSL 来保护你的会话数据。通过 SSL(HTTPS)发送的数据是完全加密的,包括头部(因此也包括 cookies)。如何防止会话劫持攻击的讨论可以在这里找到。

非常感谢你们,我现在几乎有一个可用的应用程序了 :) - bas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接