Переслать учетные данные из приложения поставщику учетных данных - PullRequest
0 голосов
/ 10 июля 2019

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

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

Я также заметил, что в документации говорится, что метод SetSerialization всегда вызывается после SetusageScenario.Но я добавил журналы, и SetSerialization никогда не вызывается после SetusageScenario.

Как я знаю, SetSerialization вызывается, когда приложением предоставляются учетные данные.Я не могу понять, что значит предоставлять учетные данные через приложение?Кажется, что это то, что мне нужно, для пересылки учетных данных из приложения поставщику учетных данных, но как я могу это сделать?Существуют ли какие-либо функции, которые я мог бы вызвать из dll провайдера учетных данных, чтобы спровоцировать вход в систему?

Есть ли способ, которым я могу добиться этого?Я читал, что когда удаленный вход в систему выполнен, вызывается UpdateRemoteCredential, но, как я понимаю (поправьте меня, если я ошибаюсь), в удаленном входе это означает RDP, но мое приложение простое, оно просто слушает какой-то порти получает имя пользователя и пароль, а затем использует функцию Logonuser.

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

Любое предложение, которое направит меня в нужное русло, будет очень

PS

Я использую pGina в качестве провайдера учетных данных.

1 Ответ

0 голосов
/ 11 июля 2019

Я бы не возражал против использования SetSerialization в вашем случае.Это используется для предварительной инициализации плитки.

Один из примеров: при подключении по RDP вы можете хранить сертификаты учетных данных в вашей системе.Эта функция используется для предварительного запроса плиток с этими учетными данными (хотя это не единственное решение).

Заставьте его вернуть E_NOTIMPL в вашем случае.

Основная цель провайдера - инициализировать учетные данныеи тайлы:

  1. Инициализация учетных данных

выполняется через функцию SetUsageScenario (автоматически вызывается после построения Provider).Там вы можете настроить поведение в зависимости от сценария, в котором вы находитесь. Самым основным из них является CPUS_LOGON.Это должно выглядеть так (это только предварительный просмотр)

HRESULT Provider::SetUsageScenario(
__in CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,
__in DWORD dwFlags
)
{
    HRESULT hr;

    switch(cpus)
    {
        case CPUS_UNLOCK_WORKSTATION:
        case CPUS_LOGON:
        hr = this->_InitCredential();
        break;

        default:
        hr = E_INVALIDARG;
        break;
    }

    return hr;
}
Инициализация плиток

начинается в функции GetCredentialCount.Он позволяет вам определить, сколько плиток вы будете показывать (параметр pdwCount out), а также ту, которая будет использоваться в качестве плитки по умолчанию (pdwDefault).Автоматический вход также описывается здесь (через pbAutoLogonWithDefault).

Перечисление плиток начинается в функции GetCredentialAt. * ​​1025 *

Передача учетных данных для аутентификации выполняется в учетных данных, которые вы используете через GetSerializationfunction.

Примеры реализации можно найти здесь .Я вряд ли настаиваю на примере, так как он легко отвлекает в зависимости от того, чего вы пытаетесь достичь.Это очень гибкий подход, и вам лучше понять назначение любой функции / параметра для соответствия вашим целям.

РЕДАКТИРОВАТЬ - см. Комментарии:

#define IDCredential        0x1

Credential::Credential(Provider* parent)
{
    //Do ssh connection or whatever

    if(success)
    {
        parent->login = retrievedLogin;
        parent->pwd = retrievedPwd;
        parent->CredentialUsed = IDCredential;
        parent->autoLogin = true;
        parent->ProviderEvents->CredentialsChanged(AdviseContext);
    }
}

HRESULT Provider::GetCredentialCount(
    __out DWORD* pdwCount,
    __out_range(<,*pdwCount) DWORD* pdwDefault,
    __out BOOL* pbAutoLogonWithDefault
    )
{
    if(this->autoLogin && this->CredentialUsed)
    {
        *pbAutoLogonWithDefault = true; // --> Instant call to GetSerialization
        *pdwDefault = this->CredentialUsed; //index of the tile
    }
    else
    {
        *pbAutoLogonWithDefault = false;
        *pdwDefault = IDCredential;
    }

    return S_OK;
}
...