2015-03-03 1 views
0

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

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

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

Та часть, войдите пользователю полномочия более или менее в соответствии с предоставленным образцом Microsoft для Credential Provider, где 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); 
} 

EDIT:

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

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; 

ответ

0

Думать, что трубы будут подходящим способом общения с сервисом. И использование диспетчера учетных данных Windows для сохранения/загрузки пароля не влияет на то, что разные сеансы входа в систему и SID пользователя отключены, пока не вошли в систему.