设置凭据管理器

向网络源提供凭据的应用程序必须执行以下操作:

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

网络源身份验证