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

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

那么:哪个功能更适合Web应用程序?您会说使用LogonUser是错误的,为什么?在某些情况下(网络配置,用户权限等),其中一种可行,而另一种则不可行?使用LogonUser是否有任何安全风险?

最佳答案

您的问题中有很多问题,下面是对所有问题的快速解答,然后提供一些详细信息。

  • .Net中的Web应用程序应使用LogonUser。这是一个Microsoft Knowledge base article with sample code
  • 可以使用LogonUser,没有任何问题。这是您大多数时候应该使用的功能。
  • LogonUser不支持Kerberos Services 4用户(S4U),但LsaLogonUser支持。从更历史的角度来说,是 LogonUser used to require TCB privilege,但现在不再存在(Passport登录除外)。有一个clever way around it anyway(在该页面中查找“SSPI的另一种用法”。)
  • 这两个功能都存在相同的风险:您不得将密码泄漏到错误消息或日志等中。但是LsaLogonUser可以获取没有密码的 token ,这在特定情况下会更安全。

  • 现在有关答案2、3和4的一些细节

    可以使用LogonUser

    如果支持用例,则应在LsaLogonUser上使用LogonUser。在大多数情况下,它会这样做,因此您可以使用LogonUser。 LsaLogonUser可以工作,但是它有很多参数,有些是指向内存的指针,必须采用特定的格式。换句话说,LsaLogonUser是C开发人员在打包结构和自相关指针的地方创建的……我不知道。凉爽的 ?

    LsaLogonUser可以给您不带密码(S4U)的 token

    在Windows Server 2003中引入了针对用户的Kerberos服务(S4U)。 S4U允许您调用KDC并为用户获取 token ,而无需提供密码。该 token 是“标识” token ,不能用于模拟用户。 LogonUser无法给您该 token ,但LsaLogonUser可以。

    基思·布朗(Keith Brown)比我能更好地解释what is S4U and how to use it

    最后

    只有一种用例是LsaLogonUser比LogonUser更好。但是从WindowsIdentity provides a constructor for that (S4U)开始,我不明白为什么在.Net应用程序中会使用LsaLogonUser。

    您的代码是好的;)

    09-25 22:18