.NET Framework中WindowsIdentity导致Kerberos会话无法清除的Bug
WindowsIdentity.RunImpersonated 导致Kerberos会话残留问题
- 在C#中使用
WindowsIdentity.RunImpersonated并传入SafeAccessTokenHandle,释放该Handle后执行C:\klist sessions命令,已释放的SafeAccessTokenHandle对应的Kerberos会话仍会被列出 - 若以服务形式运行,这类会话可能累积至数千个才会被系统清除;但如果注释掉
WindowsIdentity.RunImpersonated代码再释放用户令牌,执行klist sessions时会话会被正常清理 - 推测
WindowsIdentity.RunImpersonated静态方法内部存在引用持有,导致SafeAccessTokenHandle无法被及时清理
复现代码
using (var usertoken = ReportSecurityCredentials.FileCopyUserCredentials.LogonUser(ReportSecurityCredentials.LogonTypeSecurity, SimpleImpersonation.LogonProvider.Negotiate)) { WindowsIdentity.RunImpersonated(usertoken, () => { // 测试逻辑 }); }
执行命令
klist sessions
预期结果
模拟用户的Kerberos会话不应出现在会话列表中
内容的提问来源于stack exchange,提问作者David Revell
相关产品推荐
相关产品推荐

