2014-12-02 51 views
4

我对MVC4中的会话管理有点困惑。Session实际上是如何在MVC中工作的?

可以说,我输入了用户名和密码并单击登录按钮。 然后在服务器端,我从HttpContext.Current.Session获得SessionId。然后我正在验证该数据库的用户凭据。如果用户有效,则在Session中添加SessionId,userName和uiserId。

可以这样说,下次请求来自同一台机器和同一浏览器时,我得到了相同的SessionId,然后允许该用户访问其他信息。

现在我以下的问题:

  1. 如何服务器来知道请求是来自同一个浏览器,并从同一台机器来的?
  2. 我发现SessionId对于不同的浏览器是不同的,但是对于同一台浏览器在不同的机器上是一样的,所以如果我从machine1和google chrome登录,那么是否有可能为不同的浏览器使用相同的会话?会话将可用于具有相同浏览器的不同机器。是否有可能?)
  3. 服务器如何理解请求是针对登录的同一用户?
  4. 在asp.net会话由viewState维护,但视图状态不在MVC中使用,那么MVC中使用了什么?
+0

我会尝试回答你的具体问题,当我找到更多的时间,但我认为这个网址将帮助你清除一些疑惑。 https://gregorybeamer.wordpress.com/2012/11/04/session-and-cookies-in-asp-net-mvc-oh-my/ – SBirthare 2014-12-02 08:29:27

+0

好的,谢谢,我将通过这个URL – Ashok 2014-12-02 08:43:32

+0

会议永远不会“维护“通过ViewState,它们完全是分离的机制。 ViewState存储在页面的隐藏字段中,会话数据永远不会发送到浏览器。 – 2014-12-02 09:49:45

回答

4

首先,我建议阅读有关HTTP会话的this Wikipedia article。对你的问题的答案:

  1. 每个请求的客户端在任何一个cookie 或查询字符串发送其SessionId
  2. 这应该是不可能的默认情况下。但可以通过session hijacking完成。
  3. 服务器读取由问题1中的客户端发送的SessionId。服务器维护例如键值数据对象,以便它可以为给定的SessionId加载正确的数据。
  4. ASP MVC不使用视图状态,因为它与ASP.NET完全不同。有关更多信息,请参阅this question
+0

感谢您的回复。我明白你想说什么。请检查以下评论 - 所以这意味着我不需要做任何额外的维护用户会话。我将在HttpContext会话中添加userName及其sessionId。服务器将采取cookie值,并将获得其相关的会话和用户名和用户信息。这样对吗? 此外,我们得到相同的sessionId来自不同的机器相同的浏览器。但是你只是说会话劫持只是发生了这种情况。 那么这是怎么发生的? – Ashok 2014-12-02 12:43:50

+1

是的,除非你改变配置中的东西,否则ASP MVC会处理开箱即用的会话。如果要验证用户身份,请查看窗体身份验证:http://msdn.microsoft.com/en-us/library/ff398049(v=vs.98)。aspx同样的'SessionId'究竟是什么意思?这意味着两台机器上的cookie中的值是相同的。你可以通过在机器1的会话中放入一些东西来验证应用程序中的这种行为,并在机器2上读取它? – Marthijn 2014-12-02 13:00:33

+0

感谢您的回复。 好的,我会做到这一点。 SessionId表示从浏览器收到的sessionId – Ashok 2014-12-02 13:20:22