Web App模拟远程服务器:LogonUser还是LsaLogonUser?

时间:2012-09-21 20:36:26

标签: windows authentication web-applications

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

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

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

1 个答案:

答案 0 :(得分:5)

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

  1. .Net中的Web应用程序应使用LogonUser。这是一个Microsoft Knowledge base article with sample code
  2. 可以使用LogonUser,它没有任何问题。这是您应该在大多数时间使用的功能。
  3. LogonUser不支持Kerberos Services 4用户(S4U),但LsaLogonUser支持Kerberos Services 4用户(S4U)。更具历史意义的是LogonUser used to require TCB privilege,但不再是(护照登录除外)。有一个clever way around it anyway(寻找“该页面中SSPI的另一种用途)。
  4. 同样的风险适用于这两种功能:您不得将密码泄漏到错误消息或日志等中。但是LsaLogonUser可以获得没有密码的令牌,这使得它在特定情况下更安全。
  5. 现在回答2,3和4的一些细节

    可以使用LogonUser

    如果它支持您的用例,您应该使用LogonUser而不是LsaLogonUser。大部分时间都是这样,所以你使用LogonUser。 LsaLogonUser有效,但它有很多参数,有些是指向内存的指针,必须采用特定的格式。换句话说,LsaLogonUser是由C开发人员在打包结构和自我相对指针时制作的......我不知道。很酷?

    LsaLogonUser可以为您提供没有密码的令牌(S4U)

    在Windows Server 2003中引入了Kerberos Services for User(S4U)。 S4U允许您呼叫KDC并为用户获取令牌,而无需提供密码。该令牌是识别令牌,无法用于模拟用户。 LogonUser无法为您提供该令牌,但LsaLogonUser可以。

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

    总结

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

    你的代码很好;)