【问题标题】:Facing session issue in MVC application在 MVC 应用程序中面临会话问题
【发布时间】:2011-10-01 06:54:27
【问题描述】:

我正在使用 Asp.Net Membership,当用户输入正确的用户名和密码时,我使用以下方式登录:

FormsAuthentication.SetAuthCookie(String, Boolean)

如果我创建一个持久性 cookie,那么我认为我的会员资格仍然可以工作,但我的会话数据将为空。

这真的很烦人,并在我的应用程序中引入了很多错误。我该如何处理?

我是否应该处理 global.asax 的 Application_AuthenticateRequest 并检查我存储在 session 中的 userId 是否为 null 并且 Membership.GetUser() 不为 null,然后我应该在 Session 中再次存储 ProviderUserKey (Guid)。

这是一种合理的方法还是有更好的处理方法?

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-3 session


    【解决方案1】:

    您必须在 web.config 文件中配置会话和 authcookie 的生命周期。见:

    <forms timeout="5" />
    
    <sessionState timeout="5" />
    

    表单用于身份验证,超时时将注销 用户。您可以通过设置 SlidingExpiration 属性来“防止”超时 为“真”,它将更新用户活动的表单票(阅读 请求 asp)如果需要。这将使用户在他处于登录状态时保持登录状态 在您的网站上“活跃”。

    当会话超时时,您将丢失在 Session 对象中找到的数据。

    您的问题可能是这个问题。您的 auth-cookie 是活动的,但会话已超时。用户已登录,但会话变量被破坏!在您的应用中检查此配置。


    See this Q also

    【讨论】:

    • 我不想将表单和 sessionState 超时设置为相同。如果它们不同怎么办?我怎样才能再次在会话中设置数据?最好的方法是什么?
    • 如果会话超时,您必须重新填写它的数据。或者您可以将光数据放在 cookie 中而不是会话中。例如,我通常将名字、姓氏、电子邮件等保存在 cookie 中。你也可以把重的数据放在cookie中,但不推荐,也不建议把重的对象放在会话中。所以 1- 如果您有少量数据,请将它们放入 cookie(而不是 session) 2- 如果您有大而重的对象,最好在需要时从数据库中选择它们。
    【解决方案2】:

    我认为,您需要使用会话而不是 cookie。 根据我的说法,将 ProviderUserKey 保存在会话或任何地方都不可取。 使用 global.asax(Application_AuthenticateRequest) 检查身份验证并根据该 id 从 DB 获取 ProviderUserKey。

    希望我的评论对你有用。

    【讨论】:

      【解决方案3】:

      会话和 authcookies 是不同的。 authcookies life-time 可以在forms timeout="5" config-section 中设置,sessions life-time 应该在sessionState timeout="5" config-section 中设置。 auth-cookie 可能仍然存在,但会话已过期。检查一下。

      【讨论】:

      • 你最后的“检查这个”是什么意思?我知道 auth cookie 是持久的。那么我如何再次在会话中设置数据?最好的方法是什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 2017-09-16
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多