Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在特殊类型的Asp.NETMVC应用程序中保持用户状态的最佳实践_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4_Cookies - Fatal编程技术网

C# 在特殊类型的Asp.NETMVC应用程序中保持用户状态的最佳实践

C# 在特殊类型的Asp.NETMVC应用程序中保持用户状态的最佳实践,c#,asp.net,asp.net-mvc,asp.net-mvc-4,cookies,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Cookies,我会尽力解释我的处境和我想做什么。没有任何困难和罕见的情况,但我在网上找不到任何相关的问题或文章 我已经在ASP.NET MVC 5上创建了一个web应用程序。用户不会直接进入我的应用程序。用户将进入CentralInformationSystem.com。然后,他们必须登录到这个网站的支持方式之一。登录后,他们将看到应用程序列表。将有一些已被允许用于签名用户的应用程序。其中一个应用程序将是我在Asp.Net MVC中开发的应用程序 主要的一点是,我们的应用程序不会在其他选项卡或当前选项卡中打开

我会尽力解释我的处境和我想做什么。没有任何困难和罕见的情况,但我在网上找不到任何相关的问题或文章

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

主要的一点是,我们的应用程序不会在其他选项卡或当前选项卡中打开,以此类推。我们的应用程序将在当前选项卡内的一个大iframe中打开

另一个要点是我们的应用程序和
CentralInformationSystem.com
属于其他领域

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

MyMVCapApplication/Home/Index?令牌=jkndid758adsai==qwdbqwiudhqwadoqidwqq=wqdiqw

还要记住,他们总是会发送不同的代币

然后,我将解密令牌并找到它属于哪个用户。还要记住,一个令牌只能使用一次

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

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

2。我想要实现什么?

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

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

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

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

另一个逻辑是防止用户在多个选项卡中使用不同的令牌打开同一应用程序。但是,也不知道如何做到这一点

附加:


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

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

谢谢你的回答。让我写下我从你的话中理解的东西。我必须在重写
OnActionExecuted
方法的帮助下,将
Token
查询字符串值作为隐藏字段存储在所有视图中。并将这些数据存储在其中一个表中。然后,在用户处理应用程序时,我将使用其他数据更新此表。我还将在会话中存储一些数据,但是当会话超时时,我将从数据库中获取这些数据。然后,我可以编写一个作业,删除两天前插入的表中的所有行。我说得对吗?这听起来是个合理的方法。非常感谢。但我对这一方法的一些要点不太关心。如果你能解决这个问题,我将非常高兴。这种方法总体上好吗?我的老板对这种事情有点苛刻。İ将此类数据保存在数据库中,然后在两天后删除,这是一种糟糕的方法吗?如果您不想将它们存储在会话中,则需要将它们持久化到某个位置。您可能会使用内存中的存储,但是如果应用程序池被回收,那么您将面临数据丢失的风险。我不会有问题将它存储在数据库中,并使用某种机制定期清理它——如果你不想创建和维护一个单独的任务,也许在应用程序启动时。当然,如果是敏感信息,您需要采取与永久存储的任何敏感数据相同的预防措施。