Método ICertPolicy::VerifyRequest (certpol.h)

O método VerifyRequest notifica o módulo de política de que uma nova solicitação entrou no sistema. O módulo de política pode interagir com essa solicitação passando Contexto como um parâmetro ao recuperar ou definir propriedades na solicitação ou certificado associado.

O valor de disposição retornado indica se a solicitação foi aceita, negada ou enviada à fila de administração para avaliação posterior.

Sintaxe

HRESULT VerifyRequest(
  [in]          const BSTR strConfig,
  [in]          LONG       Context,
  [in]          LONG       bNewRequest,
  [in]          LONG       Flags,
  [out, retval] LONG       *pDisposition
);

Parâmetros

[in] strConfig

Representa o nome da autoridade de certificação, conforme inserido durante a instalação dos Serviços de Certificados. Para obter informações sobre o nome da cadeia de caracteres de configuração, consulte ICertConfig.

[in] Context

Identifica a solicitação e o certificado associado em construção. O servidor de certificado passa o contexto para esse método.

[in] bNewRequest

Se definido como TRUE, especifica que a solicitação é nova. Se definida como FALSE, a solicitação será reenviada para o módulo de política como resultado de uma chamada ICertAdmin::ResubmitRequest . Um valor false pode ser usado para indicar que o administrador deseja que a solicitação seja emitida ou que as propriedades de solicitação definidas pelo administrador devem ser examinadas.

Observe que TRUE é definido (em um arquivo de cabeçalho da Microsoft) para programadores C/C++ como um, enquanto o Visual Basic define o True palavra-chave como negativo. Como resultado, os desenvolvedores do Visual Basic devem usar um (em vez de True) para definir esse parâmetro como TRUE. No entanto, para definir esse parâmetro como FALSE, os desenvolvedores do Visual Basic podem usar zero ou False.

[in] Flags

Esse parâmetro é reservado e deve ser definido como zero.

[out, retval] pDisposition

Um ponteiro para o valor de disposição. O método define uma das seguintes disposições.

Valor Significado
VR_INSTANT_BAD
Negue a solicitação.
VR_INSTANT_OK
Aceite a solicitação.
VR_PENDING
Adicione a solicitação à fila para aceitar ou negar a solicitação posteriormente.

Retornar valor

C++

Se o método for bem-sucedido, o método retornará S_OK.

Se o método falhar, ele retornará um valor HRESULT que indica o erro. Para obter uma lista de códigos de erro comuns, consulte Valores HRESULT comuns.

VB

O valor retornado especifica a disposição, que deve ser um dos valores a seguir.
Código de retorno Descrição
VR_INSTANT_BAD
Negue a solicitação.
VR_INSTANT_OK
Aceite a solicitação.
VR_PENDING
Adicione a solicitação à fila para aceitar ou negar a solicitação posteriormente.

Comentários

VerifyRequest é livre para gerar outros processos ou acessar um banco de dados externo para fazer a verificação da solicitação. Se a verificação exigir processamento fora de banda ou intervenção humana, VerifyRequest poderá notificar outro processo ou deixar qualquer aviso da solicitação de entrada necessária. Depois que o processamento fora de banda for concluído, uma chamada para ResubmitRequest poderá ser feita ou a ferramenta de administração fornecida poderá ser usada para reenviar a solicitação para o Módulo de Política. O módulo de política pode examinar a solicitação novamente, acessar todos os dados externos necessários e retornar um valor para indicar que o certificado deve ser emitido ou negado.

Ao escrever módulos de política personalizados, você deve implementar a funcionalidade VerifyRequest em seus módulos.

Exemplos

O exemplo a seguir mostra uma possível implementação do método VerifyRequest .

#include <windows.h>
#include <stdio.h>
#include <Certpol.h>

STDMETHODIMP CCertPolicy::VerifyRequest(
             BSTR const strConfig,
             LONG Context,
             LONG bNewRequest,
             LONG Flags,
             LONG __RPC_FAR *pDisposition)
{
    HRESULT            hr;
    long               nDisp = VR_INSTANT_BAD;
    ICertServerPolicy *pServer = NULL;
    BSTR               bstrPropName = NULL;
    VARIANT            varProp;

    // Verify that pointer is not NULL.
    if ( NULL == pDisposition )
    {
        hr = E_POINTER;  // E_POINTER is #defined in Winerror.h
        goto error;
    }
    
    // Set disposition to pending.
    *pDisposition = VR_PENDING; 

    // Obtain a pointer to the CertServerPolicy interface.
    hr = CoCreateInstance( CLSID_CCertServerPolicy,
                           NULL,
                           CLSCTX_INPROC_SERVER,
                           IID_ICertServerPolicy,
                           (void **) &pServer);
    if (FAILED( hr ))
    {
        printf("Failed CoCreateInstance for pServer - %x\n", hr );
        goto error;
    }

    // Set the context to refer to this request.
    hr = pServer->SetContext(Context);
    if (FAILED( hr ))
    {
        printf("Failed SetContext(%u) - %x\n", Context, hr );
        goto error;
    }

    // This policy will perform a database check on the CN.
    // Set the property name to Subject.Commonname.
    bstrPropName = SysAllocString(L"Subject.Commonname");
    if ( NULL == bstrPropName )
    {
        hr = E_OUTOFMEMORY;  // #defined in Winerror.h
        printf("Failed SysAllocString (no memory)\n" );
        goto error;
    }

    // Retrieve the certificate property for the CN.
    // Actual implementations may want to examine other properties.
    VariantInit( &varProp );
    hr = pServer->GetCertificateProperty( bstrPropName,
                                          PROPTYPE_STRING,
                                          &varProp );
    if (FAILED(hr))
    {
        printf("Failed GetCertificateProperty - %x\n", hr);
        goto error;
    }

    // For this simple sample, merely check CN in a database.
    // (Implementation not shown, as it is application-specific).
    hr = MyDatabaseCheck( varProp.bstrVal );
    if ( S_OK == hr )
        *pDisposition = VR_INSTANT_OK;   // Accepted.
    else 
        *pDisposition = VR_INSTANT_BAD;  // Denied.

error:

    // Free resources.
    if (NULL != pServer)
        pServer->Release();

    VariantClear( &varProp );

    if ( NULL != bstrPropName )
        SysFreeString( bstrPropName );

    return(hr);
}

Requisitos

Requisito Valor
Cliente mínimo com suporte Nenhum compatível
Servidor mínimo com suporte Windows Server 2003 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho certpol.h (inclua Certsrv.h)
Biblioteca Certidl.lib

Confira também

ICertConfig

ICertPolicy

ICertPolicy2