【问题标题】:How does log off work in DNN 5.x?注销如何在 DNN 5.x 中工作?
【发布时间】:2011-06-03 21:50:05
【问题描述】:

我们发现 DNN 中没有放弃会话的问题。我不确定这是否是 4.5.x 问题,因为我们不久前升级到 5.x 并且可能引用了旧控件。

我们在模块中引用的登录/注销控件是 DotNetNuke.UI.Skins.Controls.Login,位于路径 DNN_Web_Root/admin/Skins/login.ascx

在那里,它看起来像是重定向到 logoff.aspx,然后通过 LogoffHttpHandler,然后到某个地方完成注销过程,但是我找不到该过程在哪里查看是否正在调用 Session.Abandon。

谁能回答以下问题:

  • DNN 是否存在在注销时未调用 Session.Abandon 的问题?
  • 实际处理 LogOff 进程的进程是什么?

【问题讨论】:

    标签: session dotnetnuke logoff


    【解决方案1】:

    注销通常由 Desktopmodules\Admin\Authentication\Logoff.ascx 处理。主要操作是清除身份验证 cookie,以及一些其他 cookie 和一些用户特定的缓存数据。

    DotNetNuke 从不将 Session 用于任何事情,并且在注销期间不会清除 Session。

    【讨论】:

    • DNN 在注销期间不调用 Session.Abandon 是否有原因?可能有其他模块使用 Session 还是不正确?如果不正确,为什么这种做法不正确?
    • 无论出于何种原因,DNN 都不会触及 Session。如果一个模块想使用会话,它全权负责处理会话。我建议完全不要使用 session,通常它会积累与特定页面相关的从未删除的 crud,并且在需要将其存储在进程之外并可以序列化的 web 农场中,它很快就会变得尴尬。状态几乎总是更好地保存在数据库中。仔细使用 DataCache API 可以确保快速访问该状态。
    • @thames 还有其他模块使用会话状态,我想它们中的大多数只是让会话超时,当用户不费心点击注销时它通常会这样做。如果你真的想放弃会话,你可以自定义 Logoff.ascx.cs 或者可能更安全,制作你自己的自定义副本并更新 Authentication 表中的 LogoffControlSrc 字段以指向它。
    【解决方案2】:

    看起来 Dan Rowe 对下面的代码有点运气:

    Response.Redirect(Globals.NavigateURL(TTSRoutines.giPunchinPage, "Logoff"), True)
    

    Reference

    【讨论】:

    • 这是我在问题中谈到的重定向。我还没有找到处理此重定向以注销 DNN 会话的进程。但是,我想知道 DNN 是否没有调用 Session.Abandon。
    • 它不是(但应该),原因不明。必须深入研究 DNN 来源才能找到答案。
    【解决方案3】:

    我假设您担心的威胁是共享计算机环境场景,其中有人注销但没有关闭浏览器,而下一个用户坐下并能够访问由于会话变量而不应访问的内容还在闲逛20分钟左右?

    如果您必须使用会话,一种解决方法是简单地检查

    System.Web.HttpContext.Current.User.Identity.IsAuthenticated
    

    在您担心未登录用户利用之前登录用户的会话变量的任何地方。

    话虽这么说 - 按照@ScottS 的建议在 Logoff 中调用 Session.Abandon() 可能是最简单的方法,尽管此选项在托管环境中可能不可用。

    【讨论】:

      猜你喜欢
      • 2017-06-22
      • 2023-03-20
      • 2015-07-28
      • 2013-12-28
      • 2017-11-07
      • 1970-01-01
      • 2010-09-08
      • 2011-07-01
      • 2015-09-30
      相关资源
      最近更新 更多