Dela via


Ange en autentiseringshanterare

Ett program som tillhandahåller autentiseringsuppgifter till nätverkskällan måste göra följande:

  1. Implementera ett autentiseringshanterarobjekt som exponerar IMFNetCredentialManager--gränssnittet.
  2. Innan du skapar nätverkskällan skapar du ett nytt egenskapslager.
  3. Ange egenskapen MFNETSOURCE_CREDENTIAL_MANAGER i egenskapsarkivet. Värdet för egenskapen är en pekare till IMFNetCredentialManager--gränssnittet.
  4. Skicka en pekare till egenskapsarkivet till källlösaren enligt beskrivningen i Konfigurera en mediekälla.

Nätverkskällorna använder autentiseringshanteraren för att hämta användarautentiseringsuppgifter. Om nätverkskällan kräver autentiseringsuppgifter för att komma åt en nätverksresurs anropas programmets IMFNetCredentialManager::BeginGetCredentials-metod. Det här anropet startar en asynkron begäran för att hämta användarens autentiseringsuppgifter. Metoden BeginGetCredentials kan hämta autentiseringsuppgifterna från cachen för autentiseringsuppgifter eller från användaren. Autentiseringsuppgifter lagras i ett autentiseringsobjekt. När åtgärden är klar anropar programmet motringningsgränssnittet för att meddela nätverkskällan. Nätverkskällan anropar IMFNetCredentialManager::EndGetCredentials för att slutföra den asynkrona åtgärden.

Eftersom det här är en asynkron åtgärd måste programmet skicka återanropet i slutet av åtgärden. Stegvisa instruktioner om hur du skriver en asynkron metod finns i Skriva en asynkron metod.

I följande exempel visas hur du anger egenskapen MFNETSOURCE_CREDENTIAL_MANAGER i nätverkskällan.

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

Autentisering av nätverkskälla