驗證服務提供者
若要從 Windows Media 裝置管理員存取,服務提供者必須繼承並實作IComponentAuthenticate介面。
若要自行驗證,服務提供者會執行下列步驟:
- 在具現化時,它會建立新的全域 CSecureChannelServer 物件,並從其金鑰檔設定憑證和金鑰值。
- 它會實作 IComponentAuthenticate::SACAuth 和 IComponentAuthenticate::SACGetProtocols 方法,只要將參數傳遞至其全域 CSecureChannelServer 成員即可。
- 在處理任何實作的 Windows Media 裝置管理員 方法之前,服務提供者必須呼叫 CSecureChannelServer::fIsAuthenticated 來驗證呼叫者的驗證,如果呼叫端未通過驗證,則失敗。
下列步驟會顯示在下列 C++ 範例中。
建立 CSecureChannelServer 物件
CMyServiceProvider::CMyServiceProvider()
{
HRESULT hr = S_OK;
// Create the persistent SAC object.
g_pSAC = new CSecureChannelServer();
// Set the SAC certificate.
if (g_pSAC)
{
hr = g_pSAC->SetCertificate(
SAC_CERT_V1,
(BYTE*)abCert, sizeof(abCert), // SP's certificate.
(BYTE*)abPVK, sizeof(abPVK) // SP's key.
);
}
if (FAILED(hr)) return hr;
//... Perform other class initialization here ...
return hr;
}
實作 IComponentAuthenticate 方法
STDMETHODIMP CMDServiceProvider::SACAuth(
DWORD dwProtocolID,
DWORD dwPass,
BYTE *pbDataIn,
DWORD dwDataInLen,
BYTE **ppbDataOut,
DWORD *pdwDataOutLen)
{
HRESULT hr = S_OK;
// Verify that the global CSecureChannelServer member still exists.
if (!g_pSAC)
return E_FAIL;
// Just pass the call to the global SAC member.
hr = g_pSAC->SACAuth(
dwProtocolID,
dwPass,
pbDataIn, dwDataInLen,
ppbDataOut, pdwDataOutLen
);
return hr;
}
STDMETHODIMP CMDServiceProvider::SACGetProtocols(
DWORD **ppdwProtocols,
DWORD *pdwProtocolCount)
{
HRESULT hr = E_FAIL;
if (!g_pSAC)
return hr;
hr = g_pSAC->SACGetProtocols(
ppdwProtocols,
pdwProtocolCount
);
return hr;
}
驗證呼叫端的驗證
下列程式碼範例示範服務提供者檢查呼叫端驗證,做為其 IMDServiceProvider 介面實作的一部分。
STDMETHODIMP CMyServiceProvider::GetDeviceCount(DWORD * pdwCount)
{
HRESULT hr = S_OK;
if (!g_pSAC)
return E_FAIL;
if (!(g_pSAC->fIsAuthenticated()))
return WMDM_E_NOTCERTIFIED;
*pdwCount = m_DeviceCount;
return hr;
}
相關主題