Kha*_*aid 8 ntlm kerberos windows-authentication windows-security negotiate
在搜索Windows身份验证方法和协议之后,我决定在使用IIS和Web身份验证之前了解简单可执行文件中使用的Negotiate,Kerberos和NTLM之间的确切区别.
我达到了很好的效果,但我还需要有关Negotiate和Kerberos的更多细节.
我有以下场景:
我创建了非常简单的C#窗体表单应用程序,它显示了一个消息框显示的值:
System.Security.Principal.WindowsIdentity.GetCurrent().AuthenticationType
Run Code Online (Sandbox Code Playgroud)
请注意,我是在本地计算机上具有管理员权限的域用户,我有以下结果:
当我在主动连接到DC时运行exe文件(双击)时,我得到了"Negotiate".
当我运行exe文件(作为varynet用户/使用本地用户运行),而我主动连接到DC时,我得到了"NTLM".
当我使用"以管理员身份运行"或"以不同用户身份运行"运行exe文件时,我得到了"Kerberos".
当我使用本地帐户本地登录时运行exe文件时,我得到了"NTLM".
我知道LSA会将NTLM用于本地帐户.另外我知道Active Directory使用Kerberos来验证域用户和计算机.
我的问题是,当我使用我的帐户(双击)或使用我的同一帐户"以不同用户身份运行"运行exe时,为什么我会获得协商身份验证类型?
更新:我注意到以下内容:
- 如果本地用户正在运行exe,那么它是NTLM
- 如果域用户运行exe然后它是Negotiate(如果该用户是本地管理员)但是是Kerberos(如果该用户不是本地管理员) )
- 如果域管理员运行exe,那么它是Kerberos
我只是澄清了这种行为.
首先,(你似乎在问题中理解,但只是为了清楚)EXE没有任何身份验证 - 它只是一个可执行文件.操作系统创建一个进程对象,该对象在由主体标识的登录会话中执行它.这个主体已经过NTLM或Kerberos(或其他协议)的认证.
接下来,Negotiate意味着在创建登录会话时,使用Negotiate身份验证包来决定使用哪个身份验证包 - Kerberos或NTLM.
查询该WindowsIdentity.AuthenticationType值时,您最终在调用的本地安全机构(LSA)中调用一个函数LsaGetLogonSessionData.这会报告用于运行正在执行的进程的登录会话的详细信息.创建此登录会话的方式可能对用于验证凭据的身份验证包具有最大影响.
第一次登录Windows时,Winlogon.exe通过调用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.
Run Code Online (Sandbox Code Playgroud)
因此,为进程运行的登录会话报告的程序包取决于登录会话的创建方式.(从你的问题中确切地说你是如何创建你正在测试的登录会话......在所有情况下都做"Run As"?在某些情况下注销/登录Windows?)它还取决于Winlogon能够使用哪个包首先成功进行身份验证,以进行交互式登录会话.但最后请注意,身份验证机制都会调用一些身份验证包,如果使用Negotiate,则首选Kerberos,尽管Negotiate是报告的内容.
这是一个旧的但仍然相关的图表,显示了所有身份验证如何在Windows中组合在一起:
| 归档时间: |
|
| 查看次数: |
825 次 |
| 最近记录: |