搜索Windows身份验证方法和协议,我决定了解一个简单的可执行文件中使用的Negotiate,Kerberos和NTLM之间的确切区别,然后再使用IIS和Web身份验证。
我达到了良好的效果,但我仍然需要有关Negotiate和Kerberos的更多详细信息。
我有以下情况:
我创建了非常简单的C#窗体表单应用程序,它显示了一个消息框显示的值:
System.Security.Principal.WindowsIdentity.GetCurrent().AuthenticationType
请注意,我是本地计算机上具有管理员权限的域用户,我有以下结果:
当我在主动连接到DC时运行exe文件(双击)时,我得到了#34;谈判"。
当我运行exe文件(以不同用户/使用本地用户身份运行),而我主动连接到DC时,我得到了" NTLM"。
< / LI>当我使用&#34运行exe文件时;以管理员身份运行&#34;或&#34;以不同用户身份运行&#34;我得到了#Kerberos&#34;。
当我在本地使用本地帐户登录时运行exe文件时,我得到了&#34; NTLM&#34;。
我知道LSA会将 NTLM 用于本地帐户。另外我知道Active Directory使用 Kerberos 来验证域用户和计算机。
我的问题是,当我使用我的帐户(双击)运行exe时,为什么我会获得协商身份验证类型,或者&#34;以不同的用户身份运行&#34 34;使用我的同一帐户?
更新:我注意到以下内容:
- 如果本地用户正在运行exe,那么它是 NTLM
- 如果域用户运行exe,则协商(如果该用户是本地管理员)但是 Kerberos (如果该用户不是本地管理员)
- 如果域管理员运行exe,那么它是 Kerberos
我只是澄清了这种行为。
答案 0 :(得分:6)
首先,(你似乎在问题中理解,但只是为了清楚)EXE没有任何身份验证 - 它只是一个可执行文件。操作系统creates a process object在由主体标识的登录会话中执行它。它是由NTLM或Kerberos(或其他协议)验证的此主体。
接下来,Negotiate意味着在创建登录会话时,Negotiate authentication package用于决定使用哪个身份验证包 - Kerberos或NTLM。
当您查询WindowsIdentity.AuthenticationType
值时,您最终会调用名为LsaGetLogonSessionData
的本地安全机构(LSA)中的函数。这会报告用于运行正在执行的进程的登录会话的详细信息。创建此登录会话的方式可能对用于验证凭据的身份验证包具有最大影响。
When logging into Windows the first time, Winlogon.exe establishes an interactive logon致电LsaLogonUser。它按顺序查询HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Authentication Packages
中的身份验证包,直到找到可以验证给定凭据的身份验证包。一旦建立了交互式登录,您就可以使用不同凭据下的非交互式登录创建新进程,在这种情况下,可能会调用LogonUser
函数。此函数的一个参数是dwLogonProvider
,它具有以下默认值(可能是使用的默认值):
LOGON32_PROVIDER_DEFAULT
Use the standard logon provider for the system.
The default security provider is negotiate, unless you pass NULL
for the domain name and the user name is not in UPN format.
In this case, the default provider is NTLM.
因此,针对登录会话报告的进程在下运行取决于登录会话的创建方式。 (从您的问题中可以清楚地了解如何创建您正在测试的登录会话......正在执行&#34;运行方式&#34;在所有情况下?在某些情况下注销/登录Windows?)它还取决于Winlogon能够首先成功验证哪个包用于交互式登录会话。但最后请注意,身份验证机制都会调用一些身份验证包,如果使用了Negotiate,则首选Kerberos,尽管Negotiate是报告的内容。
这是一个旧的但仍然相关的图表,显示了所有身份验证如何在Windows中组合在一起: