Предоставление учетных данных от поставщика учетных данных службе C #

Я написал пользовательские учетные данные Windows Провайдер, чтобы зафиксировать логин пользователя. Одна из основных целей этого поставщика - хранить пароль пользователя и использовать его в службе C #, работающей в Windows, при входе в систему.

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

Каким будет правильный способ передачи учетных данных службе?

Часть, которая выполняет вход пользователя с учетными данными, более или менее соответствует предоставленному Microsoft образцу для поставщика учетных данных, где GetSerialization выглядит следующим образом:

hr = ProtectIfNecessaryAndCopyPassword(_rgFieldStrings[SFI_PASSWORD], _cpus, &pwzProtectedPassword);

g_pwzProtectedPassword = pwzProtectedPassword;

if (SUCCEEDED(hr))
{
    PWSTR pszDomain;
    PWSTR pszUsername;
    hr = SplitDomainAndUsername(_pszQualifiedUserName, &pszDomain, &pszUsername);
    if (SUCCEEDED(hr))
    {
        KERB_INTERACTIVE_UNLOCK_LOGON kiul;
        hr = KerbInteractiveUnlockLogonInit(pszDomain, pszUsername, pwzProtectedPassword, _cpus, &kiul);
        if (SUCCEEDED(hr))
        {
            // We use KERB_INTERACTIVE_UNLOCK_LOGON in both unlock and logon scenarios.  It contains a
            // KERB_INTERACTIVE_LOGON to hold the creds plus a LUID that is filled in for us by Winlogon
            // as necessary.
            hr = KerbInteractiveUnlockLogonPack(kiul, &pcpcs->rgbSerialization, &pcpcs->cbSerialization);
            if (SUCCEEDED(hr))
            {
                ULONG ulAuthPackage;
                hr = RetrieveNegotiateAuthPackage(&ulAuthPackage);
                if (SUCCEEDED(hr))
                {
                    pcpcs->ulAuthenticationPackage = ulAuthPackage;
                    pcpcs->clsidCredentialProvider = CLSID_CredentialProvider;
                    // At this point the credential has created the serialized credential used for logon
                    // By setting this to CPGSR_RETURN_CREDENTIAL_FINISHED we are letting logonUI know
                    // that we have all the information we need and it should attempt to submit the
                    // serialized credential.
                    *pcpgsr = CPGSR_RETURN_CREDENTIAL_FINISHED;
                }
            }
        }
        CoTaskMemFree(pszDomain);
        CoTaskMemFree(pszUsername);
    }
    CoTaskMemFree(pwzProtectedPassword);
}

РЕДАКТИРОВАТЬ:

Я попытался использовать API диспетчера учетных данных Windows для сохранения пароля, но, похоже, это не помогло. Когда я пытаюсь получить имя пользователя / пароль после входа в систему, я ничего не получаю.

DWORD cbCreds = (DWORD)(1 + strlen(password));

CREDENTIALW cred = { 0 };
cred.Type = CRED_TYPE_GENERIC;
cred.TargetName = TargetName;
cred.CredentialBlobSize = cbCreds;
cred.CredentialBlob = (LPBYTE)password;
cred.Persist = CRED_PERSIST_LOCAL_MACHINE;
cred.UserName = *username;

return ::CredWriteW(&cred, 0) ? true : false;

person Pettor    schedule 03.03.2015    source источник


Ответы (1)


Подумайте, что трубы были бы правильным способом связи с сервисом. А использование диспетчера учетных данных Windows для сохранения / загрузки пароля не имеет никакого эффекта из-за того, что различные сеансы входа в систему и SID пользователя отключены, пока он еще не вошел в систему.

person KonstantinK    schedule 13.05.2015