Share via


Autenticación del proveedor de servicios

Para que sea accesible desde Windows Media Administrador de dispositivos, un proveedor de servicios debe heredar e implementar la interfaz IComponentAuthenticate.

Para autenticarse por sí mismo, un proveedor de servicios realiza los pasos siguientes:

  1. Al crear instancias, crea un nuevo objeto CSecureChannelServer global y establece los valores de certificado y clave de su archivo de clave.
  2. Implementa los métodos IComponentAuthenticate::SACAuth e IComponentAuthenticate::SACGetProtocols simplemente pasando los parámetros a su miembro CSecureChannelServer global.
  3. Antes de controlar los métodos implementados de Windows Media Administrador de dispositivos, el proveedor de servicios debe comprobar la autenticación del autor de la llamada mediante una llamada a CSecureChannelServer::fIsAuthenticated y se produce un error si el autor de la llamada no está autenticado.

Estos pasos se muestran en los siguientes ejemplos de C++.

Creación del objeto 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;
}

Implementación de los métodos 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;
}

Comprobación de la autenticación del autor de la llamada

En el ejemplo de código siguiente se muestra un proveedor de servicios que comprueba la autenticación del autor de la llamada como parte de su implementación de la interfaz 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;
}

Creación de un proveedor de servicios