Настройка диспетчера учетных данных

Приложение, предоставляющее учетные данные источнику сети, должно выполнять следующие действия.

  1. Реализуйте объект диспетчера учетных данных, который предоставляет интерфейс IMFNetCredentialManager .
  2. Перед созданием сетевого источника создайте новое хранилище свойств.
  3. Задайте свойство MFNETSOURCE_CREDENTIAL_MANAGER в хранилище свойств. Значение свойства является указателем на интерфейс IMFNetCredentialManager .
  4. Передайте указатель на хранилище свойств в сопоставитель источника, как описано в разделе Настройка источника мультимедиа.

Сетевые источники используют диспетчер учетных данных для получения учетных данных пользователя. Если источнику сети требуются учетные данные для доступа к сетевому ресурсу, он вызывает метод IMFNetCredentialManager::BeginGetCredentials приложения. Этот вызов запускает асинхронный запрос на получение учетных данных пользователя. Метод BeginGetCredentials может получить учетные данные либо из кэша учетных данных, либо от пользователя. Учетные данные хранятся в объекте учетных данных. После завершения операции приложение вызывает интерфейс обратного вызова для уведомления сетевого источника. Источник сети вызывает IMFNetCredentialManager::EndGetCredentials для завершения асинхронной операции.

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

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

// Creates a media source from a URL.
//
// Demonstrates how to set a credential manager on the network source.

HRESULT CreateMediaSourceWithCredentialManager(
    PCWSTR pszURL, 
    IMFMediaSource **ppSource
    )
{
    IPropertyStore *pConfig = NULL;

    CCredentialManager *pCredentials = new (std::nothrow) CCredentialManager();

    if (pCredentials == NULL)
    {
        return E_OUTOFMEMORY;
    }

    // Configure the property store.
    HRESULT hr = PSCreateMemoryPropertyStore(IID_PPV_ARGS(&pConfig));

    if (SUCCEEDED(hr))
    {
        PROPERTYKEY key;
        key.fmtid =  MFNETSOURCE_CREDENTIAL_MANAGER;
        key.pid = 0;

        PROPVARIANT var;
        var.vt = VT_UNKNOWN;
        pCredentials->QueryInterface(IID_PPV_ARGS(&var.punkVal));

        hr = pConfig->SetValue(key, var);

        PropVariantClear(&var);
    }

    // Create the source media source.
    if (SUCCEEDED(hr))
    {
        hr = CreateMediaSource(pszURL, pConfig, ppSource);
    }

    SafeRelease(&pConfig);
    SafeRelease(&pCredentials);

    return hr;
}

Проверка подлинности источника сети