Как проверить кэшированные учетные данные пользователя по домену?

Когда вы входите в Windows, ваши учетные данныекэшируются, Это позволяет вам использоватьЕдиная точка входа, Если вы хотите перейти на другой компьютер, например:

\\hydrogen

ты быне запросить учетные данные.

Windows примет ваше:

текущее имя пользователя(хешированный) пароль

и попытаться аутентифицировать вас автоматически. Интересно, что это работает, даже если ваша рабочая станция не находится в домене. Windows будетавтоматически используйте ваше имя пользователя и пароль при подключении к серверу. И если ваш:

местный имя пользователя / пароль соответствуетдомен имя пользователя Пароль

вы автоматически впускаете.

Приятная картина:

Это называетсяЕдиная точка входа, Вы входите в Windows один раз, и ваши кэшированные учетные данные используются для проверки вас, когда вы используете другие вещи в сети.

Браузеры также делают это

Chrome, Internet Explorer и Firefox также делают это. Если вам нужно войти на сайт, а сервер поддерживаетПереговоры После авторизации сервер отправит вам сообщение о том, что вам следует попробовать учетные данные пользователя Windows / Домена / Kerberos:

HTTP/1.1 401 Unauthorized
Server: Microsoft-IIS/7.5
WWW-Authenticate: Negotiate
Date: Thu, 09 Jul 2015 14:35:58 GMT
Content-Length: 0

Chrome потом возьметкэшируются учетные данные и (после некоторой промежуточной магии) перенаправить их на веб-сервер:

GET http://hr.woodglue.com HTTP/1.1
Host: hr.woodglue.com
Authorization: Negotiate YIIFzwYGKwYBBQUCoIIFwzCCBb....

Microsoft рассказывает об этом механизме в Internet Explorer в старой статье:

Кросс-платформенная аутентификация на основе HTTP с использованием протокола согласования

Клиент звонитAcquireCredentialsHandle() а такжеInitializeSecurityContext() с SPN для создания контекста безопасности, который запрашивает билет сеанса из TGS / KDC.Вы проверяете по домену, а не по серверам

И последнее, что я хочу упомянуть, это то, что серверы, веб-серверы, рабочие станции, файловые серверы не проверяют учетные данныесервер, они проверяют по доменуконтроллер, У вас туманностьлес из многих серверов доменов, и один из них обрабатывает ваш запрос.

Другими словами, вы не проверяете учетные данные по:

\\uranium (контроллер домена наwoodglue.com домен)

вы проверяете учетные данные в отношении:

woodglue.com домен

У нас есть важное понятие, что кто-то может:

подтвердить свойкэшируются полномочияпротив доменабез необходимости вводить имя пользователя или парольКак я могу это сделать?

Как я могу проверить чьи-то кэшированные учетные данные? Как можетI:

проверить пользователякэшируются полномочияпротивдоменбез пользователь должен ввести имя пользователя или пароль(т.е. с использованием кэшированных учетных данных Windows)

Важным моментом является то, что не знаю (или все равно):

если компьютер пользователя подключен к доменуесли машина пользователя присоединена к рабочей группеесли компьютер пользователя подключен кwoodglue.com или какой-либо другой домен (например,superglue.com)имена серверов, которые питаютsuperglue.com домен

Я не знаю, как это сделать.
Я не знаю, какие технологии API задействованы.

Я знаю, что есть API под названиемИнтерфейс поставщика поддержки безопасности (ССПИ). Это то, что полномочияWWW-Authenticate: Negotiate (хотя я не знаю, работает ли это с SMB от компьютера, не подключенного к домену).

Открытый исходный код Chromium мог бы начать нас с фрагмента из ихhttp_auth_sspi_win.cc, Они используют функцию SSPIAcquireCredentialsHandle:

int AcquireDefaultCredentials(CredHandle* cred) 
{
   TimeStamp expiry;
   // Pass the username/password to get the credentials handle.
   // Note: Since the 5th argument is NULL, it uses the default
   // cached credentials for the logged in user, which can be used
   // for a single sign-on.
   SECURITY_STATUS status = library->AcquireCredentialsHandle(
         NULL,  // pszPrincipal
         const_cast<SEC_WCHAR*>(package),  // pszPackage
         SECPKG_CRED_OUTBOUND,  // fCredentialUse
         NULL,  // pvLogonID
         NULL,  // pAuthData
         NULL,  // pGetKeyFn (not used)
         NULL,  // pvGetKeyArgument (not used)
         cred,  // phCredential
         &expiry);  // ptsExpiry
}

Передайте имя пользователя / пароль, чтобы получить дескриптор учетных данных.

Замечания: Поскольку 5-й аргумент равен NULL, он использует кэшированные учетные данные по умолчанию для вошедшего в систему пользователя, которые можно использовать для единого входа.

это«Исходящий» позвонитьAcquireCredentialsHandle сопровождается звонкомInitializeSecurityContext, Идея в том, чтоInitializeSecurityContext генерирует непрозрачный BLOB-объект, представляющий клиента.

Затем вы можете выполнить параллельный набор вызовов:

«Въездной» позвонитьAcquireCredentialsHandleвызовAcceptSecurityContextПроходя мимо блоба, возвращенного ранее изInitializeSecurityContext

кукрасть rehostОтличный образ Даниэля Дубровкина:

Заметка: В этом случае«Клиент» а также«Сервер» используются для ссылки на контекст производителя и потребителя. В моем случае«Клиент» а также«Сервер» находятся на одной машине.

Но эта линия"показывает исследовательские усилия" разваливается, потому что я нигде не вижу вInitializeSecurityContext где я могу указатьwoodglue.com в качестве домена для проверки.

я знаю этоInitializeSecurityContext связывается с сервером Kerberos и получает"билет" клякса. Этот бланк билета затем передается на «сервер» черезAcceptSecurityContext, Иногда большой двоичный объект может передаваться по сети; в моем случае это передается в памяти на той же машине.

Но я не вижу, как указать сервер домена, с которым он должен связатьсяза этот билет

Не означает, что SSPI вообще полезен для решения моей проблемы. Это просто"исследовательская работа".

Старые исследованияКакое TargetName использовать при вызове InitializeSecurityContext (Negotiate)?Как проверить учетные данные домена (из нативного кода)?Проверить пароль пользователя с помощью хэша?Win32: Как проверить учетные данные в Active Directory?Как выполнить проверку подлинности Windows?

Конечно, во время всего этого, если кэшированные учетные данные недопустимы в указанном домене, мне придется запросить у пользователя имя пользователя и пароль. Но имена пользователей и пароли - это зло, бич вычислений, и я хочу их избежать.

я использую нативный код; не C #.

Ответы на вопрос(0)

Ваш ответ на вопрос