我有一个C#Web应用程序(在某些配置中),该应用程序允许用户输入Windows凭据,然后该凭据用于对远程服务进行身份验证。为此,我们当前调用LogonUser并使用生成的 token 创建WindowsIdentity,然后将其模拟。一切正常,没有任何实际问题。
最近,我正在阅读有关Web身份验证的内容,并了解到对于基本身份验证,IIS使用LsaLogonUser创建模拟上下文。我有点理解这两者之间的区别,听起来我们应该使用LsaLogonUser,但是我讨厌做出我不了解的更改,但好处并不明显。另一方面,使用IIS的人比我更了解Windows API。
那么:哪个功能更适合Web应用程序?您会说使用LogonUser是错误的,为什么?在某些情况下(网络配置,用户权限等),其中一种可行,而另一种则不可行?使用LogonUser是否有任何安全风险?
最佳答案
您的问题中有很多问题,下面是对所有问题的快速解答,然后提供一些详细信息。
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的另一种用法”。)现在有关答案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。
您的代码是好的;)