Share via


Establecimiento de un administrador de credenciales

Una aplicación que proporcione credenciales al origen de red debe hacer lo siguiente:

  1. Implemente un objeto de administrador de credenciales que exponga la interfaz IMFNetCredentialManager .
  2. Antes de crear el origen de red, cree un nuevo almacén de propiedades.
  3. Establezca la propiedad MFNETSOURCE_CREDENTIAL_MANAGER en el almacén de propiedades. El valor de la propiedad es un puntero a la interfaz IMFNetCredentialManager .
  4. Pase un puntero al almacén de propiedades al solucionador de origen, tal y como se describe en Configuración de un origen multimedia.

Los orígenes de red usan el administrador de credenciales para obtener las credenciales de usuario. Si el origen de red requiere credenciales para acceder a un recurso de red, llama al método IMFNetCredentialManager::BeginGetCredentials de la aplicación. Esta llamada inicia una solicitud asincrónica para obtener las credenciales del usuario. El método BeginGetCredentials puede obtener las credenciales de la memoria caché de credenciales o del usuario. Las credenciales se almacenan en un objeto de credencial. Una vez completada la operación, la aplicación invoca la interfaz de devolución de llamada para notificar al origen de red. El origen de red llama a IMFNetCredentialManager::EndGetCredentials para completar la operación asincrónica.

Dado que se trata de una operación asincrónica, la aplicación debe enviar la devolución de llamada al final de la operación. Para obtener instrucciones paso a paso sobre cómo escribir un método asincrónico, consulte Escritura de un método asincrónico.

En el ejemplo siguiente se muestra cómo establecer la propiedad MFNETSOURCE_CREDENTIAL_MANAGER en el origen de red.

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

Autenticación de origen de red