Cassini-dev的NTLM身份验证中的SecurityIdentifiers

时间:2011-11-23 11:21:59

标签: c# windows-authentication ntlm cassini-dev security-identifier

在Cassini-dev的NTLM身份验证类的这段代码中,对SECUR32.DLL(通过 Interop )的调用用于验证HTTP请求Authorization中的base64编码数据头。这是有道理的,当 AcceptSecurityContext() QuerySecurityContextToken()返回0时,客户端已被授权。最后,安全上下文令牌从中提取SecurityIdentifier _sid 变量)。 (有点common Security IDs

以下是NtlmAuth Class

的相关部分
int num = Interop.AcceptSecurityContext(ref _credentialsHandle, zero,
                     ref _inputBufferDesc, 20,
                     0, ref _securityContext, ref _outputBufferDesc,
                     ref _securityContextAttributes, ref _timestamp);
if (num == 0x90312)
{
    securityContextAcquired = true;
    _blob = Convert.ToBase64String(inArray, 0, (int) _outputBuffer.cbBuffer);
}
else
{
    if (num != 0)
    {
        return false;
    }
    IntPtr phToken = IntPtr.Zero;
    if (Interop.QuerySecurityContextToken(ref _securityContext, ref phToken) != 0)
    {
         return false;
    }
    try
    {
         using (WindowsIdentity identity = new WindowsIdentity(phToken))
    {
         _sid = identity.User;
    }
}
finally
{
    Interop.CloseHandle(phToken);
}
_completed = true;

Request Class中,在使用NtlmAuth的TryNtlmAuthenticate()方法中,在成功完成NTLM身份验证的3个步骤之后,在返回最终 403 之前或满足要求,正在进行最后一次检查:

if (_host.GetProcessSid() != auth.SID)
{
    _connection.WriteErrorAndClose(0x193);
    return false;
}

此处, _host.GetProcessSid()是Cassini进程(我)所有者的SecurityIndentifier,而 auth.SID 是{{已验证的用户的1}}(来自上面的NtlmAuth类的 _sid )。如果这2个SID不相同,则返回403并停止验证,否则请求将提供给浏览器。


我的问题是:

  1. 为什么需要比较2个不同用户的SecurityIndentifier?当我尝试使用不是拥有Cassini进程的用户的用户/密码进行NTLM身份验证时,这会失败(返回403)。
  2. 如果这确实是预期的行为,如果Cassini要作为Windows服务运行,则没有人能够登录,因为主机SID将是 S-1-5-18 (或也许类似的东西取决于操作系统版本),没有人可以作为操作系统登录。这只是Cassini的NTLM身份验证实现的一部分,我没有正确使用Cassini吗?
  3. 如果这显然不是预期的行为,SecurityIndentifiers在此上下文中扮演什么角色?是否需要进行额外检查以确保主机SID需要属于某个类或组才能接受某个类/组的客户端SID?处理主机/客户端SID时是否存在操作系统版本(XP / Vista / 7)?
  4. 或者SecurityIdentifiers没有适用的用途,因为它们没有被存储或传递,也没有用于进一步识别用户/客户端?

  5. 更新:似乎有人在cassinidev论坛proposed a patch which removes this SID check(补丁#6604)回到2010年,但它仍在评估中。

1 个答案:

答案 0 :(得分:1)

不是答案,但我只是注意到类似的问题,但略有不同的表现形式:当托管在Windows服务中并且Cassini-dev配置为使用Windows身份验证时,HttpContext.Current.User是帐户服务正在运行,而不是发出请求的用户。

这对我来说似乎是cassini-dev中的一个错误。