設定認證管理員
提供認證給網路來源的應用程式必須執行下列動作:
- 實作公開 IMFNetCredentialManager 介面的認證管理員物件。
- 建立網路來源之前,請先建立新的屬性存放區。
- 在屬性存放區上 設定MFNETSOURCE_CREDENTIAL_MANAGER 屬性。 屬性的值是 IMFNetCredentialManager 介面的指標。
- 將屬性存放區的指標傳遞至來源解析程式,如 設定媒體來源中所述。
網路來源會使用認證管理員來取得使用者認證。 如果網路來源需要認證才能存取網路資源,它會呼叫應用程式的 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;
}
相關主題