다음을 통해 공유


서비스 공급자 인증

Windows Media 장치 관리자 액세스하려면 서비스 공급자가 IComponentAuthenticate 인터페이스를 상속하고 구현해야 합니다.

자체 인증을 위해 서비스 공급자는 다음 단계를 수행합니다.

  1. 인스턴스화 시 새 전역 CSecureChannelServer 개체를 만들고 해당 키 파일에서 인증서 및 키 값을 설정합니다.
  2. 매개 변수를 전역 CSecureChannelServer 멤버에 전달하기만 하면 IComponentAuthenticate::SACAuth 및 IComponentAuthenticate::SACGetProtocols 메서드를 구현합니다.
  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;
}

서비스 공급자 만들기