gpt4 book ai didi

c# - 存储在 CallContext 中的数据会在请求之间泄漏吗?

转载 作者:太空狗 更新时间:2023-10-30 01:36:11 25 4
gpt4 key购买 nike

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

在寻找上述解决方案的替代方案时,我想到了 ThreadStatic 属性。这似乎工作正常(至少乍一看)。但后来我阅读了更多关于该属性的信息,发现一个请求实际上可以由多个线程处理(在我的情况下这不是特别的问题)并且一些线程可以在多个请求中重用(极端但显然很少见的情况) ).现在这听起来像是一个真正的问题,这意味着我曾经从数据库中提取的用户数据可能会泄露给另一个请求,并且一个用户可以根据另一个用户的数据进行验证。

所以我搜索了另一种选择并找到了 CallContext。这次我还注意到人们警告说它可能不会像人们期望的那样工作。在 ThreadStatic 的情况下,人们解释了使用它的风险是什么,但在 CallContext 的情况下则没有那么多。

那么,存储在 CallContext 中的数据是否会从一个请求泄漏到另一个请求(就像 ThreadStatic 字段可能发生的那样),或者可能发生的最坏情况是在请求中间丢失数据(我可以忍受)?

最佳答案

In an MVC app I need to store some user data to verify if he has all the rights to access some pages (like he is an owner of an object etc.).

您要找的是HttpContext.Session , 作为 @Ron's answer建议。您需要启用 session 支持。

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

Can data stored in CallContext leak between requests?

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

不过,它确实在同一请求内的线程之间流动,因此就此而言,它可以用作 ThreadLocal 的替代品。不过,请谨慎使用,因为存在写时复制行为,请查看 Stephen Cleary 的博客 for more details .如果您使用异步 Controller 方法和async/await(或ContinueWith 等),您可能只需要它。

关于c# - 存储在 CallContext 中的数据会在请求之间泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22931946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com