【发布时间】:2012-04-17 21:58:54
【问题描述】:
我专门指的是Impersonating user with Entity Framework 的公认答案,其中包含以下代码:
using (((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate())
using (var dbContext = new MyEntityFrameworkContainer())
{
...
}
我宁愿只在我的存储库中的一个地方实例化dbContext,它实现IDisposable,然后在处置实体时处置上下文。我不确定上面的两个using 作用域是如何相互影响的,那么如何在避免使用块的同时实现这段代码在模拟方面的作用?
添加:
正如下面的答案所建议的那样,我可以简单地使用局部变量并“手动”确保资源被释放,但我在这里担心的是内部using 中的实例化是否会受到外部using 的影响。如果这只是一生的问题,并且外部 using 没有建立任何上下文或影响内部的任何内容,那么以下答案已经回答了我的问题。
【问题讨论】:
-
旁注:延长在模拟用户身份(数据库连接、文件、进程)下创建的对象的生命周期可能是严重的安全问题。考虑在完成模拟后使其难以继续使用此类对象。制作类似 Repository.ForImpersonatedUser(identity) 的东西可能是一种选择。
-
@AlexeiLevenkov,我不明白你建议我用
Repository.ForImpersonatedUser(identity)做什么 -
您的存储库可能包含在模拟期间创建的对象(即在特定用户帐户下连接到数据库)。如果此对象与可能以或可能不以同一用户身份运行的其他代码共享,则您有问题。因此,您可以拥有为特定用户创建的对象的存储库,并在完成模拟后立即销毁存储库。根据数据的敏感性,您可能需要编写额外的代码来强制对象在模拟结束后不提供任何信息。
-
@AlexeiLevenkov,所以
ForImpersonatedUser是一个因子方法,它返回一个模拟传递的身份的仓库? -
是的。如果您碰巧遇到问题,请选择任何方法来实现它 - 我只是想提出简短的自我描述名称......
标签: c# .net asp.net-mvc-3