Configurando um Gerenciador de Credenciais
Um aplicativo que fornece credenciais para a fonte de rede deve fazer o seguinte:
- Implemente um objeto do gerenciador de credenciais que expõe a interface IMFNetCredentialManager .
- Antes de criar a fonte de rede, crie um novo repositório de propriedades.
- Defina a propriedade MFNETSOURCE_CREDENTIAL_MANAGER no repositório de propriedades. O valor da propriedade é um ponteiro para a interface IMFNetCredentialManager .
- 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;
}
Tópicos relacionados