你的问题有很多问题,这里是所有问题的快速答案,然后是一些细节。
- .Net 中的 Web 应用程序应使用
LogonUser
. 这是带有示例代码的 Microsoft 知识库文章。
- 用起来
LogonUser
没问题,没毛病。这是您大部分时间应该使用的功能。
LogonUser
不支持 Kerberos 服务 4 用户 (S4U),但支持LsaLogonUser
。从历史上看,LogonUser
过去需要 TCB 权限,但现在不再需要(Passport 登录除外)。无论如何,有一个聪明的方法(在该页面中查找“SSPI 的另一种用途”)。
- 同样的风险适用于这两个功能:您不能在错误消息或日志等中泄漏密码。但是 LsaLogonUser 可以在没有密码的情况下获取令牌,这使得它在特定情况下更安全。
现在关于答案 2、3 和 4 的一些细节
可以使用 LogonUser
如果它支持您的用例,您应该使用 LogonUser 而不是 LsaLogonUser。大多数情况下,它确实如此,因此您使用 LogonUser。LsaLogonUser 可以工作,但它有很多参数,有些是指向必须采用特定格式的内存的指针。换句话说,LsaLogonUser 是由 C 开发人员在打包结构和自相关指针时制作的......我不知道。凉爽的 ?
LsaLogonUser 可以给你一个没有密码的令牌 (S4U)
在 Windows Server 2003 中引入了 Kerberos 用户服务 (S4U)。S4U 允许您调用 KDC 并为用户获取令牌,而无需提供密码。该令牌是一个识别令牌,它不能用于模拟用户。LogonUser 无法为您提供该令牌,但 LsaLogonUser 可以。
Keith Brown 解释了什么是 S4U 以及如何更好地使用它。
综上所述
只有一个用例是 LsaLogonUser 优于 LogonUser。但是由于WindowsIdentity 为 (S4U) 提供了一个构造函数,我不明白为什么有人会在 .Net 应用程序中使用 LsaLogonUser 。
你的代码很好;)