Как получить полномочия при использовании SSPI?

Когда вы используете API интерфейса поставщика поддержки безопасности (SSPI) для проверки учетных данных пользователя, сервер получает контекст безопасности дескриптор.

Затем вы можете использовать QueryContextAttributes для запроса информации об дескрипторе контекста безопасности:

  • QueryContextAttributes(handle,SECPKG_ATTR_LIFESPAN)
    • tsStart: Time at which the context was established.
    • tsExpiry: время истечения срока действия контекста.
  • QueryContextAttributes(handle,SECPKG_ATTR_AUTHORITY)
    • sAuthorityName: the name of the authenticating authority, if available.
  • QueryContextAttributes(handle,SECPKG_ATTR_PASSWORD_EXPIRY)
    • tsPasswordExpires: when the credentials for the security context expire.
  • QueryContextAttributes(handle,SECPKG_ATTR_PACKAGE_INFO)
    • Name: the name of the security package.
    • Комментарий. Это может быть любая дополнительная строка, возвращенная пакетом.
  • QueryContextAttributes(handle,SECPKG_ATTR_NATIVE_NAMES)
    • sClientName: the principal name for the client in the outbound ticket.
    • sServerName: основное имя сервера в исходящем билете.
  • QueryContextAttributes(handle,SECPKG_ATTR_CLIENT_SPECIFIED_TARGET)
    • sTargetName: The SPN of the initial target.

Когда я использую SSPI для проверки своих учетных данных, сервер получает набор информации обо мне меня, один из элементов не работает:

  • Дескриптор контекста: 0x04CC9F4000AC8B80
  • Имя пользователя: STACKOVERFLOW\ian
  • Имя собственного клиента: [email protected]
  • Имя собственного сервера: [email protected]
  • SID пользователя: S-1-5-21-1708537768-844245398-2146844275-1109
  • Цель, указанная клиентом: ian
  • Уполномоченный: The function requested is not supported (80090302)
  • Срок действия пароля истекает (UTC):
  • Начало срока службы: 10/23/2019 11:03 ᴀᴍ
  • Срок действия: 10/23/2019 7:32 ᴘᴍ
  • Имя пакета: Kerberos
  • Комментарий к пакету: Microsoft Kerberos V1.0
  • Возможности пакета: 0x028F3BBF
  • Версия пакета: 0001
  • Идентификатор Rpc пакета: 0010
  • Максимальная длина токена пакета: 48000

Удостоверение личности

Я хочу знать авторитет, который подтвердил (или поручился за кешированные) учетные данные.

За исключением того, что вызов QueryContextAttributesQueryContextAttributesEx) с SECPKG_ATTR_AUTHORITY завершается с ошибкой:

// MessageId: SEC_E_UNSUPPORTED_FUNCTION
//
// MessageText:
//
//  The function requested is not supported
//

SEC_E_UNSUPPORTED_FUNCTION       = HRESULT($80090302);

Что ты делаешь?

Я могу найти его с помощью командной строки:

C:\Users\Ian>SET

LOGONSERVER=\\HYDROGEN

Но я использую API.

Справочная информация: как работает SSPI

SSPI был разработан как универсальная оболочка для различных алгоритмов безопасности. Способ использования API довольно прост:

  • Client:
    • calls InitializeSecurityContext and is given a blob
    • клиент отправляет этот блоб на сервер
  • Server:
    • calls AcceptSecurityContext(blob), and is given a blob back
    • сервер отправляет этот блоб обратно клиенту
  • Client:
    • calls InitializeSecurityContext(blob), and is given back a blob
    • клиент отправляет этот большой двоичный объект обратно на сервер
  • Server:
    • calls AcceptSecurityContext(blob), and is given a blob back
    • ...повторять, пока не будет остановлено...

Обе стороны продолжают двигаться вперед и назад, пока функция не перестанет возвращать большой двоичный объект, который необходимо отправить другой стороне:

введите здесь описание изображения

И так с SSPI вы делаете это пинг-понг взад и вперед, пока вам не скажут остановиться. Таким образом, они смогли впихнуть каждую схему аутентификации в эту высокоуровневую абстракцию типа «пинг-понг, пока не скажут остановить».

А как вы передаете блобы?

Вы передаете BLOB-объекты по любому каналу связи, который используете.

Если вы разговариваете с удаленным сервером через TCP/IP, вы, вероятно, использовали бы это:

// Open connection to server
sockConnect(162.210.196.166, 1433);

blob = null;

Boolean bContinue = InitializeSecurityContext(ref blob);

while (bContinue)
{
   sockWrite(blob); //send the blob to the server

   blob = sockRead(); //wait for the server to return a blob 

   bContinue = InitializeSecurityContext(ref blob);
}

Если вы делаете это через http:

blob = null;
Boolean bContinue = InitializeSecurityContext(ref blob);

while (bContinue)
{
    http = new HttpRequest("http://4chan.org/default.aspx");
    http.AddHeader("X-SSPI-Blob", blob.ToBase64());
    http.Send();

    blob = http.ReasponseHeader["X-SSPI-Blob"];
    if (blob.IsEmpty())
       break;

    bContinue = InitializeSecurityContext(ref blob);
}

Вы даже можете отправить их почтовым голубем!

Бонусное чтение

SSPI — это имя реализации Windows RFC4121.

Универсальный программный интерфейс службы безопасности (GSS-API)

Бонус Бонус


person Ian Boyd    schedule 23.10.2019    source источник
comment
QueryContextAttributes не поддерживает атрибут SECPKG_ATTR_AUTHORITY , приводит к ошибке недопустимого параметра для меня. И QueryContextAttributesEx приводит к ошибке ссылки для меня. Кажется, это пропущено в Secur32.lib. Итак, не могли бы вы показать воспроизводимую демонстрацию и шаги? Тестирую на Windows 10 1903.   -  person Rita Han    schedule 24.10.2019
comment
@RitaHan-MSFT Ошибка ссылки имеет смысл, если вы используете C/C++; файлы SDK .lib неверны. Убедитесь, что вы загружаете SspiCli.dll и экспортированную функцию QueryContextAttributesExW (или эквивалент Ansi). Но я бы не стал слишком много работать: QueryContextAttributesEx тоже не работает.   -  person Ian Boyd    schedule 24.10.2019
comment
Спасибо, что помогли мне найти путь. Да, я воспроизвел эту проблему (ошибка 0x80090302). Я проконсультируюсь с соответствующим инженером по этой проблеме и обновлю здесь как можно скорее.   -  person Rita Han    schedule 25.10.2019
comment
Кстати, какая у вас версия Windows?   -  person Rita Han    schedule 25.10.2019
comment
@RitaHan-MSFT >ver: Microsoft Windows [Version 10.0.18362.418]   -  person Ian Boyd    schedule 25.10.2019
comment
@RitaHan-MSFT Итак, как проходит консультация с соответствующим инженером? Были ли у них идеи за последние 3 месяца?   -  person Ian Boyd    schedule 14.01.2020
comment
Извините за задержку. Они работают над этим и сообщат вам в первый раз, если будет какой-либо результат.   -  person Rita Han    schedule 15.01.2020