【问题标题】:Best practice for persisting User State in special kind of Asp.Net Mvc application在特殊类型的 Asp.Net Mvc 应用程序中保持用户状态的最佳实践
【发布时间】:2015-07-28 04:55:45
【问题描述】:

我将尝试解释我的情况以及我想做什么。没有任何困难和罕见的情况,但我在网上找不到任何相关的问题或文章。

我在 ASP.NET MVC 5 上创建了一个 Web 应用程序。用户不会直接进入我的应用程序。用户将输入让我们说CentralInformationSystem.com。然后他们必须以一种受支持的方式登录该网站。登录后,他们将看到应用程序列表。将有已被允许用于已签名用户的应用程序。其中一个应用程序将是我在Asp.Net MVC 开发的应用程序。

重点是我们的应用程序不会在其他选项卡或当前选项卡等中打开。我们的应用程序将在当前选项卡内的一个大 iframe 中打开。

另外一个重点是我们的应用和CentralInformationSystem.com属于其他域。

当然,另一个问题是,我现在如何哪个用户已登录?答案是,CentralInformationSystem.com 将带有查询字符串的加密数据发送到我们的网站。例如,URL 将如下所示:

MyMvcApplication/Home/Index?Token=jkndid758adsai==qwdbqwiudhqwadoqidwqq=wqdiqw

还要记住,他们总是会发送不同的令牌。

然后,我将解密令牌并找到它属于哪个用户。另外请注意,一个Token只能使用一次。

1.我的申请是什么类型的申请?

用户将输入非常大的表格。它实际上可能需要将近 3-4 个小时。所以,我尝试了某种类型的向导逻辑。输入部分数据后,我会将它们插入数据库,从数据库中获取标识符并将其存储在某个地方,然后将用户带到下一个级别等等。

2.我想达到什么目标?

我想创建这样的逻辑,在用户关闭浏览器或退出之前,必须将一些标识符变量值存储在永远不能过期的位置。我不想将会话超时增加到 5-6 小时。

3.如果用户在多个选项卡中打开我的应用程序怎么办?

除了 2 我还有一个问题,用户可以在 iframe 中打开我的网站多个选项卡。我知道,在Asp.net 中,我们可以为每个选项卡设置不同的会话。但是,我不想在会话中存储数据,因为用户可以在 20 分钟或 4 小时后停止填写表格。另外,我不能使用 cookie,因为所有选项卡的 cookie 都是相同的。

我的另一个选择是向所有视图注入具有加密值的隐藏输入。但是,我找不到如何将这些数据自动添加到每个视图中。此外,在我看来,这并不是最有效的方式。

另一种逻辑是防止用户在多个标签中使用不同的令牌打开相同的应用程序。但是,也不要如何实现这一点。

补充:

我已经阅读了几乎所有的文章和问题/答案。我知道如何让它发挥作用。但是,我想要最好的方法。我的两种方法都没有效率。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4 cookies


    【解决方案1】:

    使用您自己的持久会话概念,该会话由页面上的隐藏输入标识并且不会过期,或者至少不会过期很长时间。让所有控制器派生自单个基本控制器,并在结果为 ViewResult 时使用 OnActionExecuted 将会话“密钥”添加到 ViewBag(部分视图或 JSON 等不需要它)。然后每个页面都可以访问 ViewBag 并创建隐藏的输入 - 可能您想为此使用局部视图并简单地在每个页面上包含局部视图。将与此会话关联的数据存储在数据库中。

    【讨论】:

    • 感谢您的回答。让我写下我从你的话中所理解的。正如我所知道的,我必须在覆盖OnActionExecuted 方法的帮助下将所有视图中的Token 查询字符串值存储为隐藏字段。并将这些数据存储在其中一个表中。然后,当用户处理应用程序时,我将使用其他数据更新此表。我也会将其中一些数据存储在会话中,但是当会话超时时,我将从数据库中取回这些数据。然后,我可以编写一个作业,该作业将从两天前插入的该表中删除所有行。我说的对吗?
    • 这听起来很合理。
    • 非常感谢。但我对这种方法的某些观点不太担心。如果您能解决这个问题,我将非常高兴。这种方法总体上好吗?我的老板对这些事情有点苛刻。将此类数据保存在数据库中然后在两天后删除是一种不好的方法吗?
    • 如果您不想将它们存储在会话中,则需要将它们保存在某个地方。您可能会使用内存存储,但如果应用程序池被回收,您将面临数据消失的风险。将它存储在数据库中并使用某种机制定期清理它不会有问题 - 如果您不想创建和维护单独的任务,也许在应用程序启动时。当然,如果是敏感信息,您需要采取与永久存储的任何敏感数据相同的预防措施。
    猜你喜欢
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 2017-05-13
    相关资源
    最近更新 更多