我有一个C#Web应用程序(在某些配置中)允许用户输入Windows凭据,然后用于对远程服务进行身份验证。为实现此目的,我们当前调用LogonUser并使用生成的令牌创建WindowsIdentity,然后我们将其模拟。它一直很好,没有真正的问题。
最近我读到了有关Web身份验证的内容,并了解到基本身份验证IIS使用LsaLogonUser来创建模拟上下文。我有点理解两者之间的区别,听起来我们应该使用LsaLogonUser,但我讨厌做出一些我不理解的改变,因为一个不明确的好处。另一方面,在IIS上工作的人比我更了解Windows API。
那么:哪个函数更适合Web应用程序?你会说使用LogonUser是错误的,为什么?是否有情况(网络配置,用户权限等),哪一个会工作,另一个不会?使用LogonUser是否存在任何安全风险?
答案 0 :(得分:5)
你的问题有很多问题,这里有一个快速回答所有问题,然后是一些细节。
LogonUser
。这是一个Microsoft Knowledge base article with sample code。 LogonUser
,它没有任何问题。这是您应该在大多数时间使用的功能。 LogonUser
不支持Kerberos Services 4用户(S4U),但LsaLogonUser
支持Kerberos Services 4用户(S4U)。更具历史意义的是LogonUser
used to require TCB privilege,但不再是(护照登录除外)。有一个clever way around it anyway(寻找“该页面中SSPI的另一种用途)。现在回答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。
你的代码很好;)