1

我是学习 MVC 4(4.5) 的 asp.net 新手。当他的登录信息发布时,我运行以下代码将登录用户名存储在会话中

[Anonymous]
public ActionResult Login(LoginModel model)
{
    Session["Username"]=model.Username;
    ///something else
} 

在另一个文件中的某个地方我可以使用Session["Username"]. 好的,我对我目前的困惑的问题是什么时候该对象将被垃圾收集或销毁。

session_start()我知道在另一种脚本语言(如 PHP)中,我必须调用 session_end()所有需要使用此类似会话对象数据的文件。我在新创建的 MVC 4 项目中找不到相同的东西,但身份验证机制似乎在某处为我完成了。

4

2 回答 2

1

何时该对象将被垃圾收集或销毁。

会话到期时。会话状态在您的 web.config 中使用<sessionState>节点进行配置。你可以看看following overview关于会话。默认情况下,ASP.NET 将会话数据存储在内存中。这意味着如果您的应用程序在网络场中运行,您将遇到问题,因为该网络场的不同节点可能看不到存储在其他节点上的值。如果要在这种情况下使用会话,则必须配置进程外会话状态,例如StateServerSqlServer。默认会话状态模式的另一个问题InProc是,如果 IIS 决定回收您的应用程序,您可能会丢失存储在其中的数据。还有一个根本不使用会话或使用进程外会话存储的原因。

因此,例如,您可以为会话指定超时,如下所示:

<sessionState mode="InProc" timeout="20" />

默认值为 20 分钟。但是,这将再次取决于您使用的模式。

我知道在另一种脚本语言(如 PHP)中,我必须在需要使用这种类似会话对象数据的所有文件中调用 session_start() 和 session_end()。

无需担心 ASP.NET MVC 中的此类事情。


现在说了这么多,我建议你根本不要使用任何会话。ASP.NET 已经为您提供了跟踪经过身份验证的用户的必要机制。您可以使用Forms Authentication专为安全跟踪经过身份验证的用户而设计的。

因此,首先关闭 ASP.NET 会话:

<sessionState mode="Off" />

进而:

[Anonymous]
public ActionResult Login(LoginModel model)
{
    // TODO: check credentials, ...

    FormsAuthentication.SetAuthCookie(model.Username, false);
    //something else

    // finally redirect and inside the target controller action
    // you will be able to retrieve the authenticated user
    return RedirectToAction("SomeProtectedAction");
} 

然后您可以装饰受保护的控制器操作,这些操作只能由具有该[Authorize]属性的经过身份验证的用户访问,并在其中检索当前经过身份验证的用户:

[Authorize]
public ActionResult SomeProtectedAction()
{
    string username = User.Identity.Name;
    // something else ...
}
于 2013-02-17T16:35:29.727 回答
0

看看 Global.asax

从应用程序开始到会话,再到请求开始/结束等等,您都有各种事件......

但是请注意,不能保证调用“结束”方法。所以不要指望他们。

如果您决定使用会话,请不要像您在示例中那样使用字符串溢出它。为您的会话创建一个具有适当属性的类和一个 SessionManager 来处理它。从长远来看,它将对您有很大帮助。

于 2013-02-17T16:44:40.937 回答