Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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# CallContext中存储的数据能否在请求之间泄漏?_C#_Asp.net Mvc - Fatal编程技术网

C# CallContext中存储的数据能否在请求之间泄漏?

C# CallContext中存储的数据能否在请求之间泄漏?,c#,asp.net-mvc,C#,Asp.net Mvc,在MVC应用程序中,我需要存储一些用户数据,以验证他是否拥有访问某些页面的所有权限(例如他是对象的所有者等)。我尝试在我的一个服务中添加一个私有静态字段来处理用户数据,并添加一个静态的get-only属性来访问私有字段。如果专用字段为空,则此属性从数据库中提取用户数据。显然这是个坏主意,因为MVC应用程序不仅仅在请求期间有效,所以一旦设置了私有静态字段,它就会无限期地停留在那里 通过搜索上述解决方案的替代方案,我找到了ThreadStatic属性。这似乎很好(至少乍一看是这样)。但是后来我读了更

在MVC应用程序中,我需要存储一些用户数据,以验证他是否拥有访问某些页面的所有权限(例如他是对象的所有者等)。我尝试在我的一个服务中添加一个私有静态字段来处理用户数据,并添加一个静态的get-only属性来访问私有字段。如果专用字段为空,则此属性从数据库中提取用户数据。显然这是个坏主意,因为MVC应用程序不仅仅在请求期间有效,所以一旦设置了私有静态字段,它就会无限期地停留在那里

通过搜索上述解决方案的替代方案,我找到了ThreadStatic属性。这似乎很好(至少乍一看是这样)。但是后来我读了更多关于该属性的内容,发现一个请求实际上可以由多个线程处理(在我的例子中,这不是一个特别的问题),一些线程可以在多个请求中重用(极端但显然很少见)。这听起来像是一个真正的问题,这意味着我曾经从数据库中提取的用户数据可能会泄漏到另一个请求,并且一个用户可以根据另一个用户的数据进行验证

因此,我寻找了另一种选择,并找到了CallContext。这一次,我还注意到,人们发出警告说,它可能不会按预期的方式工作。对于ThreadStatic,Pople解释了使用它的风险,但对于CallContext,则没有那么多

这样,存储在CALLVER上下文中的数据可以从一个请求泄漏到另一个请求(比如它可以在线程静态字段中发生),或者最坏的情况是在请求中间丢失数据(我可以忍受)? 顺便说一下,HttpContext是“每个请求”,如果您想保存数据库访问,可以使用“会话”,通过创建一个AbstractController,可以避免控制器和操作之间的重复

在MVC应用程序中,我需要存储一些用户数据,以验证他是否拥有所有数据 访问某些页面的权限(例如他是对象的所有者) 等等)

你要找的是我建议的。您需要启用会话支持

OTOH,HttpContext.Items的生存期仅限于给定的HTTP请求,它不会在请求之间流动。一些HTTP协议文本状态数据(如cookie)将通过
HttpContext.Current.Request
传递

CallContext中存储的数据能否在请求之间泄漏

如果您仍然想知道逻辑调用上下文数据(
CallContext.LogicalGetData
/
CallContext.LogicalSetData
)是否在不同的HTTP请求之间流动,那么答案将是。如果有,那将是一个严重的安全漏洞,因为不同的请求可能来自不同的用户


但是,它确实在同一请求内的线程之间流动,因此可以将其用作
ThreadLocal
的替代品。A尽管如此,要小心使用,因为有抄写行为,请查看Stephen Cleary的博客。只有当您使用异步控制器方法和
async
/
wait
(或
ContinueWith
等)时,才可能需要它。

我当前的堆栈是WCF,而不是ASP.Net,但我想回答OP在标题中提出的问题:

与我在网络上遇到的任何和所有资源相反,与之相反,与原因相反(主要的安全漏洞等),我相信正确的答案,至少对于WCF来说,是:

是。

我想说的是,我并不完全理解其中的道理,我也无法确定地再现这一点。尽管如此,由于我怀疑这可能是基于我们在公司遇到的一些偶发异常情况,我已经设置了一个实验,通过
CallContext.LogicalSetData()
存储
OperationContext.Current.IncomingMessageHeaders.Action
(在WCF中,这是操作的名称),然后刷新一百万次,等待偶发异常的断点命中。最后,我将存储的值与
OperationContext.Current.IncomingMessageHeaders.Action
进行了比较,并且操作(因此请求)不同

可能相关:在我的WCF应用程序中读取和写入
LogicalCallContext
的代码在
MessageInspector
中运行

不幸的是,我缺乏创建稳定工作复制示例的深入知识。请随时询问我可能忽略的任何其他相关细节,如配置值、环境变量等,以直面我的测试用例如何可能是错误的。我发现我自己的发现有些令人震惊,甚至不太可能,我很乐意接受纠正。在此之前,我认为与社区分享这是一个好主意

.Net Framework版本:4.7.2

WCF服务托管在IIS中



关于我对about
LogicalCallContext
的观察,您可以找到一些其他信息。

会话是另一种选择吗?@Ron实际上在控制器中作为实例处理一切是一种可行的选择,但我尝试使用static和ThreadStatic的主要原因是为了减少许多控制器和操作中的重复代码。您是否使用异步控制器和
async/await
?@nosratio据我所知,我不使用异步控制器或async/await感谢您就如何解决我的问题提出建议,但我仍然很想知道CallContext是否会遇到与ThreadStatic相同的问题。我的理解是,由于当ASP.NET将请求从一个线程迁移到另一个线程时,CallContext不会迁移,因此在使用ASP.NET时,它会遇到相同的问题。