Mic*_*ens 9 c# windows impersonation
在我掌握Windows中用户模仿的细微差别的过程中,我首先遇到了一个关于冒充远程数据库的问题(请参阅此SO问题),但我终于弄明白了.我的下一个障碍是撤消/取消/恢复(选择你最喜欢的动词)模仿.
我尝试了几个不同的模拟库,这对我来说是可信的:
结果与两个库相同.最佳实践要求使用LOGON32_LOGON_NEW_CREDENTIALS登录类型(请参阅Windows API LogonUser函数)进行远程数据库连接.当我这样做时,这是我的示例代码产生的:
// SCENARIO A
BEGIN impersonation.
Local user = MyDomain\MyUser
DB reports: MyDomain\ImpersonatedUser
END impersonation.
Local user = MyDomain\MyUser
DB reports: MyDomain\ImpersonatedUser << NOT EXPECTED HERE!!
Run Code Online (Sandbox Code Playgroud)
我找到的唯一解决方法是使用LOGON32_LOGON_INTERACTIVE登录类型,然后我得到:
// SCENARIO B
BEGIN impersonation.
Local user = MyDomain\ImpersonatedUser << EXPECTED, BUT NOT WANTED!
DB reports: MyDomain\ImpersonatedUser
END impersonation.
Local user = MyDomain\MyUser
DB reports: MyDomain\MyUser
Run Code Online (Sandbox Code Playgroud)
从WindowsImpersonationContext.Undo方法的简洁描述来看,它似乎应该在方案A中起作用.
是否可以使用LOGON32_LOGON_NEW_CREDENTIALS登录类型进行恢复?
感谢Harry Johnston(在问题附带的评论中)和Phil Harding(在单独的通信中)的输入,我能够确定SQL Server 连接池是这里的罪魁祸首.由于池是由连接字符串的唯一性决定的,通过稍微改变连接字符串(例如,在其中的参数的反转顺序,或者甚至只是在末尾添加空格),然后我观察了我期望的行为.
===== TEST WITH SAME CONN STRING: True
BEGIN impersonation
Local user: MyDomain\msorens
DB reports: MyDomain\testuser
END impersonation
Local user: MyDomain\msorens
DB reports: MyDomain\testuser <<<<< still impersonating !!
===== TEST WITH SAME CONN STRING: False
BEGIN impersonation
Local user: MyDomain\msorens
DB reports: MyDomain\testuser
END impersonation
Local user: MyDomain\msorens
DB reports: MyDomain\msorens <<<<< this is what I wanted to get
Run Code Online (Sandbox Code Playgroud)
我挖到了连接池的内部,结果证明Windows凭据根本不被视为连接池密钥的一部分.只考虑SQL登录.
因此,如果在用户A下打开了可用连接,并且您现在正在模拟用户B,它仍然会使用它,并且SQL会将您视为用户A.反过来也是如此.
为两个不同的用户稍微改变连接字符串的方法很好.如果您有一个"普通"用户,那么您可能会这样做,然后您需要冒充一些"提升"用户.当然,您不希望为应用程序的每个用户使用不同的字符串- 否则您也可以完全禁用连接池.
调整连接字符串时,您可以考虑将模拟的用户名附加到Application Name
或Workstation ID
字段.这样可以为每个模拟用户设置一个单独的池.
归档时间: |
|
查看次数: |
3943 次 |
最近记录: |