Как определяются сценарии использования поставщика учетных данных

В настоящее время я пытаюсь понять, как создаются пользовательские поставщики учетных данных.

У меня есть образец, чтобы помочь мне. Этот образец специально реализует ICredentialProvider и ICredentialProviderFilter для WinLogon. Моя работа заключается в реализации сценария использования CPUS_CREDUI.

Тем не менее, есть много вещей, которые я не получаю в начальной реализации, поэтому я даже не могу рассчитывать на свою собственную реализацию.

Вся документация, которую я нашел, только объясняет, что на самом деле делает каждая часть. Это единственная часть, которая «достаточно ясна» в моей голове.

Проблема в том, что я не могу соединить эти части вместе.

Различные функции, казалось, вызывались самой Windows. Как я могу узнать, кто вызывающий абонент, какие параметры используются и тому подобное? Если бы я знал, я мог бы лучше понять весь процесс.

Например :

  • Существует повторяющийся параметр типа CREDENTIAL_PROVIDER_USAGE_SCENARIO, который, по-видимому, изменяет способ инициализации CP в коде. Кажется, сначала он определен в конструкторе CredentialProvider, но поскольку я не знаю, что вызывает конструктор... Я предполагаю, что он вызывается WinLogon, но если да, то что на самом деле определяет параметры?

  • В журналах примера значение этого параметра всегда отображается как «CPUS_LOGON». Если это следствие того, что конструктор CP вызывается WinLogon (если моя предыдущая гипотеза верна), как может быть вызван CPUS_CREDUI после входа в систему?

Это основные вопросы, которые у меня есть до сих пор. Спасибо, если кто-то может осветить меня.

Я также открыт для любой дополнительной информации, которую вы хотели бы иметь для меня.


person Sillimon    schedule 02.05.2019    source источник


Ответы (1)


Ознакомьтесь с документацией Microsoft Одним из первых обращений к поставщику учетных данных будет SetUsageScenario

HRESULT SetUsageScenario(
    CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,
  DWORD                              dwFlags
);

Первый параметр — сценарий.
Если ваш провайдер не предназначен для указанного сценария, вы можете просто вернуть E_INVALIDARG.

person Alexander    schedule 03.05.2019
comment
Благодаря вашему ответу я смог отобразить плитку в пользовательском интерфейсе учетных данных. У меня есть случай переключения на «процессор», и я создаю учетные данные внутри случая CPUS_CREDUI. Но документ говорит, что я должен обрабатывать значения dwFlags, переданные в параметре. Возьмем, к примеру, CREDUIWIN_GENERIC, который говорит: «Вызывающий абонент запрашивает, чтобы поставщик учетных данных вернул имя пользователя и пароль в виде обычного текста». Что это на самом деле означает с точки зрения кода? SetUsageScenario возвращает HRESULT, поэтому я думаю, что я не должен получать логин/пароль и возвращать их отсюда, верно? - person Sillimon; 03.05.2019
comment
user name and password in plain text означает, что вы должны собрать эти учетные данные и упаковать их с помощью функции CredPackAuthenticationBuffer. Эти учетные данные будут возвращены пользовательскому интерфейсу учетных данных при вызове метода GetSerialisation. Ваш провайдер не должен возвращать учетные данные Certificate или другие типы учетных данных без пароля (даже кодированные или зашифрованные). - person Alexander; 06.05.2019
comment
Я могу персонализировать плитку и отобразить ее. Обнаружены SetSelected и SetDeselected и их способность вызывать GetSerialization. Я воспроизвел «простые» учетные данные, и, похоже, они отлично работают с жестко запрограммированными значениями, введенными для GetSerialization. Сейчас я ищу, как заставить плитку ожидать чтения смарт-карты (я имею в виду, как ее структурировать). Я думаю о цикле в потоке, ожидающем инструкции kill, тогда он (каким-то образом, до сих пор не знаю, как «запустить» его, кроме как установить для pbAutoLogon значение TRUE) вызовет GetSerialization. В любом случае, очень ценю вашу помощь! я обновлю позже - person Sillimon; 06.05.2019
comment
Получил это работает. Я забыл обновить rgbSerialization и cbSerialization в параметре GetSerialization __out. В основном я пытался пройти аутентификацию без каких-либо учетных данных, что, вероятно, является причиной ошибки. В любом случае, большое спасибо за всю вашу помощь! - person Sillimon; 14.05.2019