Authentification du fournisseur de services

pour être accessible à partir de Windows Gestionnaire de périphériques de média, un fournisseur de services doit hériter et implémenter l’interface IComponentAuthenticate .

Pour s’authentifier, un fournisseur de services effectue les étapes suivantes :

  1. En cas d’instanciation, elle crée un nouvel objet global CSecureChannelServer et définit les valeurs de certificat et de clé à partir de son fichier de clé.
  2. Il implémente les méthodes IComponentAuthenticate :: SACAuth et IComponentAuthenticate :: SACGetProtocols en passant simplement les paramètres dans son membre CSecureChannelServer global.
  3. avant de gérer les méthodes d’Gestionnaire de périphériques de média Windows implémentées, le fournisseur de services doit vérifier l’authentification de l’appelant en appelant CSecureChannelServer :: fIsAuthenticated et échouer si l’appelant n’est pas authentifié.

Ces étapes sont présentées dans les exemples C++ suivants.

Création de l’objet 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;
}

Implémentation des méthodes 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;
}

Vérification de l’authentification de l’appelant

L’exemple de code suivant montre un fournisseur de services vérifiant l’authentification de l’appelant dans le cadre de son implémentation de l’interface 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;
}

Création d’un fournisseur de services