В этом блоке кода в классе аутентификации NTLM Cassini-dev, вызовы, сделанные в SECUR32.DLL (через Interop ), выполняются для аутентификации закодированных в base64 данных в заголовках Authorization
HTTP-запроса.Это имеет смысл, когда оба AcceptSecurityContext () и QuerySecurityContextToken () возвращают 0
, клиент авторизован.В конце токен контекста безопасности извлекает из него SecurityIdentifier
(переменная _sid ).(Немного о общих идентификаторах безопасности )
Вот соответствующий раздел 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;
В запросе Класс , в методе TryNtlmAuthenticate()
, где используется NtlmAuth, после успешного завершения 3 шагов аутентификации NTLM перед возвратом либо окончательного 403 или выполнения запроса выполняется одна последняя проверкаmade:
if (_host.GetProcessSid() != auth.SID)
{
_connection.WriteErrorAndClose(0x193);
return false;
}
Здесь _host.GetProcessSid () - это SecurityIndentifier
владельца процесса Cassini (me) и auth.SID SecurityIdentifier
пользователя, который был аутентифицирован ( _sid из класса NtlmAuth выше).Если эти 2 SID не совпадают, возвращается 403, и аутентификация прекращается, в противном случае запрос передается в браузер.
Мои вопросы:
- Почемувам нужно сравнить SecurityIndentifiers 2 разных пользователей?Это завершается ошибкой (возвращает 403), когда я пытаюсь NTLM аутентифицироваться с помощью пользователя / пароля, который не пользователь, которому принадлежит процесс Cassini.
- Если это действительно предполагаемое поведение,если Cassini будет работать как служба Windows, никто не сможет войти в систему, потому что SID хоста будет S-1-5-18 (или, возможно, что-то похожее в зависимости от версии ОС), и никто не сможетвойдите как операционная система.Является ли это только частью реализации аутентификации NTLM в Cassini, и я неправильно использую Cassini?
- Если это явно не предполагаемое поведение, какую роль в этом контексте играет SecurityIndentifiers?Нужно ли проводить дополнительные проверки, чтобы убедиться, что идентификаторы SID хоста относятся к определенному классу или группе, чтобы принимать идентификаторы SID клиента определенного класса / группы?Существуют ли последствия версии ОС (XP / Vista / 7) при работе с идентификаторами безопасности хоста / клиента?
- Или здесь нет применимых применений SecurityIdentifiers, поскольку они не хранятся, не передаются и не используютсядля дальнейшей идентификации пользователя / клиента?
Обновление: Похоже, что кто-то на форумах cassinidev предложил патч, который удаляет эту проверку SID (патч № 6604) еще в 2010 году, но он все еще оценивается.