サービス プロバイダーの認証
Windows Media デバイス マネージャーからアクセスできるようにするには、サービス プロバイダーが IComponentAuthenticate インターフェイスを継承して実装する必要があります。
それ自体を認証するために、サービス プロバイダーは次の手順を実行します。
- インスタンス化時に、新しいグローバル CSecureChannelServer オブジェクトを作成し、そのキー ファイルから証明書とキーの値を設定します。
- パラメーターをグローバル CSecureChannelServer メンバーに渡すだけで、 IComponentAuthenticate::SACAuth メソッドと IComponentAuthenticate::SACGetProtocols メソッドを実装します。
- 実装された 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;
}
関連トピック