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

我有一个C#Web应用程序(在某些configuration中)允许用户inputWindows凭据,然后用它来validation远程服务。 为了达到这个目的,我们现在调用LogonUser并使用结果标记来创build一个WindowsIdentity,然后我们模拟它。 这工作正常,没有真正的问题。

最近我正在阅读有关Web身份validation的内容,并且读到了基本身份validation,IIS使用LsaLogonUser来创build模拟上下文。 我有点理解两者之间的差异,这听起来像我们应该使用LsaLogonUser,但我讨厌做出改变,我不明白的不明确的好处。 另一方面,从事IIS工作的人比我更了解Windows API。

那么:哪个函数更适合Web应用程序? 你会说使用LogonUser是错误的,为什么? 有没有情况下(networkingconfiguration,用户权限等),一个将工作,另一个不会? 使用LogonUser有没有什么安全风险?

在你的问题中有很多问题,这里是对所有问题的快速回答,接下来是一些细节。

  1. .Net中的Web应用程序应该使用LogonUser 。 这是带有示例代码的Microsoft知识库文章 。
  2. 可以使用LogonUser ,没有什么问题。 这是你应该在大部分时间使用的功能。
  3. LogonUser不支持Kerberos服务4用户(S4U),但LsaLogonUser 。 更有历史意义的是, LogonUser曾经需要TCB权限 ,但不再是了(Passport登录除外)。 无论如何,有一个聪明的方法 (寻找“SSPI在该页面的另一个用途)。
  4. 同样的风险适用于这两个函数:不能泄漏错误信息或日志等密码,但LsaLogonUser可以获得一个没有密码的令牌,这使得在特定情况下更安全。

现在回答2,3和4的一些细节

可以使用LogonUser

如果支持您的用例,您应该通过LsaLogonUser使用LogonUser。 大多数情况下,它使用LogonUser。 LsaLogonUser的工作原理,但它有很多的参数,有些是内存的指针,必须在一个特定的格式。 换句话说,LsaLogonUser是由C开发人员在打包结构和自我相对指针时所做的…我不知道。 酷?

LsaLogonUser可以给你一个没有密码的令牌(S4U)

在Windows server 2003中引入了用户的Kerberos服务(S4U)。 S4U允许您呼叫KDC并为用户获取令牌,而无需提供密码。 该令牌是Identify令牌, 不能用来模拟用户。 LogonUser不能给你那个令牌,但是LsaLogonUser可以。

基思·布朗解释了什么是S4U,以及如何比以前更好地使用它 。

结论是

只有一个用例是LsaLogonUser比LogonUser好。 但是由于WindowsIdentity为这个(S4U)提供了一个构造函数 ,我不明白为什么在.Net应用程序中会使用LsaLogonUser。

你的代码是好的;)