共用方式為


驗證服務提供者

若要從 Windows Media 裝置管理員存取,服務提供者必須繼承並實作IComponentAuthenticate介面。

若要自行驗證,服務提供者會執行下列步驟:

  1. 在具現化時,它會建立新的全域 CSecureChannelServer 物件,並從其金鑰檔設定憑證和金鑰值。
  2. 它會實作 IComponentAuthenticate::SACAuthIComponentAuthenticate::SACGetProtocols 方法,只要將參數傳遞至其全域 CSecureChannelServer 成員即可。
  3. 在處理任何實作的 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;
}

建立服務提供者