在Cassini-dev的NTLM身份验证类的这段代码中,对SECUR32.DLL(通过 Interop )的调用用于验证HTTP请求Authorization
中的base64编码数据头。这是有道理的,当 AcceptSecurityContext()和 QuerySecurityContextToken()返回0
时,客户端已被授权。最后,安全上下文令牌从中提取SecurityIdentifier
( _sid 变量)。 (有点common Security IDs)
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并停止验证,否则请求将提供给浏览器。
我的问题是:
更新:似乎有人在cassinidev论坛proposed a patch which removes this SID check(补丁#6604)回到2010年,但它仍在评估中。
答案 0 :(得分:1)
不是答案,但我只是注意到类似的问题,但略有不同的表现形式:当托管在Windows服务中并且Cassini-dev配置为使用Windows身份验证时,HttpContext.Current.User是帐户服务正在运行,而不是发出请求的用户。
这对我来说似乎是cassini-dev中的一个错误。