3

我有一个 C# Web 应用程序,它(在某些配置中)允许用户输入 Windows 凭据,然后使用它来对远程服务进行身份验证。为此,我们当前调用LogonUser并使用生成的令牌创建一个 WindowsIdentity,然后我们将模拟它。它工作正常,没有真正的问题。

最近,我正在阅读有关 Web 身份验证的内容,并阅读了 IIS 使用LsaLogonUser来创建模拟上下文的基本身份验证。我有点理解两者之间的区别,听起来我们应该使用 LsaLogonUser,但我讨厌为了不清楚的好处做出我不理解的更改。另一方面,从事 IIS 工作的人比我更了解 Windows API。

那么:哪个功能更适合 Web 应用程序?你会说使用 LogonUser 是错误的吗?为什么?是否存在一种情况(网络配置、用户权限等)可以工作而另一种不能工作的情况?使用 LogonUser 是否存在任何安全风险?

4

1 回答 1

5

你的问题有很多问题,这里是所有问题的快速答案,然后是一些细节。

  1. .Net 中的 Web 应用程序应使用LogonUser. 这是带有示例代码的 Microsoft 知识库文章
  2. 用起来LogonUser没问题,没毛病。这是您大部分时间应该使用的功能。
  3. LogonUser不支持 Kerberos 服务 4 用户 (S4U),但支持LsaLogonUser。从历史上看,LogonUser过去需要 TCB 权限,但现在不再需要(Passport 登录除外)。无论如何,有一个聪明的方法(在该页面中查找“SSPI 的另一种用途”)。
  4. 同样的风险适用于这两个功能:您不能在错误消息或日志等中泄漏密码。但是 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 。

你的代码很好;)

于 2012-09-28T16:48:25.637 回答