Configurando um Gerenciador de Credenciais

Um aplicativo que fornece credenciais para a fonte de rede deve fazer o seguinte:

  1. Implemente um objeto do gerenciador de credenciais que expõe a interface IMFNetCredentialManager .
  2. Antes de criar a fonte de rede, crie um novo repositório de propriedades.
  3. Defina a propriedade MFNETSOURCE_CREDENTIAL_MANAGER no repositório de propriedades. O valor da propriedade é um ponteiro para a interface IMFNetCredentialManager .
  4. Passe um ponteiro para o repositório de propriedades para o resolvedor de origem, conforme descrito em Configurando uma fonte de mídia.

As fontes de rede usam o gerenciador de credenciais para obter credenciais de usuário. Se a fonte de rede exigir credenciais para acessar um recurso de rede, ela chamará o método IMFNetCredentialManager::BeginGetCredentials do aplicativo. Essa chamada inicia uma solicitação assíncrona para obter as credenciais do usuário. O método BeginGetCredentials pode obter as credenciais do cache de credenciais ou do usuário. As credenciais são armazenadas em um objeto de credencial. Quando a operação é concluída, o aplicativo invoca a interface de retorno de chamada para notificar a origem da rede. A fonte de rede chama IMFNetCredentialManager::EndGetCredentials para concluir a operação assíncrona.

Como essa é uma operação assíncrona, o aplicativo deve expedir o retorno de chamada no final da operação. Para obter instruções passo a passo sobre como escrever um método assíncrono, consulte Escrevendo um método assíncrono.

O exemplo a seguir mostra como definir a propriedade MFNETSOURCE_CREDENTIAL_MANAGER na origem da rede.

// 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;
}

Autenticação de Origem de Rede