我是一名asp.net新手学习MVC 4(4.5)。我运行以下代码,以便在发布登录信息时将登录用户名存储在会话中
[Anonymous]
public ActionResult Login(LoginModel model)
{
Session["Username"]=model.Username;
///something else
}
在某个地方的另一个文件中,我可以使用Session["Username"]
。好吧,我对当前混乱的问题就是什么时候这个对象会被垃圾收集或销毁。
我知道像PHP这样的另一种脚本语言,我必须打电话
需要使用此类似会话对象数据的所有文件中的session_start()
和session_end()
。我在新创建的MVC 4项目中找不到相同的东西,但认证机制似乎都在我身上完成。
答案 0 :(得分:1)
此对象将被垃圾收集或销毁。
会话到期时。使用<sessionState>
节点在web.config中配置会话状态。您可以查看有关会话的following overview
。默认情况下,ASP.NET将会话数据存储在内存中。这意味着如果您的应用程序在Web场中运行,您将遇到问题,因为此Webfarm的不同节点可能看不到存储在某个其他节点上的值。如果要在此类方案中使用会话,则必须配置进程外会话状态,例如StateServer
或SqlServer
。默认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 ...
}
答案 1 :(得分:0)
看看Global.asax
在那里你有各种活动,从应用程序启动到会话,到请求开始/结束等等......
但请注意,&#39;结束&#39;不保证可以调用方法。所以不要指望他们。
如果您决定使用会话,请不要像在示例中那样使用字符串。为您的会话创建一个具有适当属性的类,并使用SessionManager来处理它。从长远来看,它会对你有很大帮助。