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

El método VerifyRequest notifica al módulo de directiva que ha escrito una nueva solicitud en el sistema. Después, el módulo de directiva puede interactuar con esa solicitud pasando Context como parámetro al recuperar o establecer propiedades en la solicitud o certificado asociado.

El valor de disposición devuelto indica si la solicitud se ha aceptado, denegado o se ha enviado a la cola de administración para su evaluación posterior.

Sintaxis

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

Parámetros

[in] strConfig

Representa el nombre de la entidad de certificación, tal como se escribió durante la configuración de Servicios de certificados. Para obtener información sobre el nombre de la cadena de configuración, vea ICertConfig.

[in] Context

Identifica la solicitud y el certificado asociado en construcción. El servidor de certificados pasa el contexto a este método.

[in] bNewRequest

Si se establece en TRUE, especifica que la solicitud es nueva. Si se establece en FALSE, la solicitud se vuelve a enviar al módulo de directivas como resultado de una llamada ICertAdmin::ResubmitRequest . Se puede usar un valor false para indicar que el administrador quiere que se emita la solicitud o que se deben examinar las propiedades de solicitud establecidas por el administrador.

Tenga en cuenta que TRUE se define (en un archivo de encabezado de Microsoft) para programadores de C/C++ como uno, mientras que Visual Basic define la palabra clave True como negativa. Como resultado, los desarrolladores de Visual Basic deben usar uno (en lugar de True) para establecer este parámetro en TRUE. Sin embargo, para establecer este parámetro en FALSE, los desarrolladores de Visual Basic pueden usar cero o False.

[in] Flags

Este parámetro está reservado y debe establecerse en cero.

[out, retval] pDisposition

Puntero al valor de disposición. El método establece una de las siguientes disposiciones.

Valor Significado
VR_INSTANT_BAD
Denegar la solicitud.
VR_INSTANT_OK
Acepte la solicitud.
VR_PENDING
Agregue la solicitud a la cola para aceptar o denegar la solicitud más adelante.

Valor devuelto

C++

Si el método se realiza correctamente, el método devuelve S_OK.

Si se produce un error en el método, devuelve un valor HRESULT que indica el error. Para obtener una lista de códigos de error comunes, consulte Valores HRESULT comunes.

VB

El valor devuelto especifica la disposición, que debe ser uno de los valores siguientes.
Código devuelto Descripción
VR_INSTANT_BAD
Denegar la solicitud.
VR_INSTANT_OK
Acepte la solicitud.
VR_PENDING
Agregue la solicitud a la cola para aceptar o denegar la solicitud más adelante.

Comentarios

VerifyRequest es libre de generar otros procesos o acceder a una base de datos externa para realizar la comprobación de la solicitud. Si la comprobación requiere un procesamiento fuera de banda o una intervención humana, VerifyRequest puede notificar a otro proceso o dejar cualquier aviso de la solicitud entrante requerida. Una vez completado el procesamiento fuera de banda, se puede realizar una llamada a ResubmitRequest o se puede usar la herramienta de administración proporcionada para volver a enviar la solicitud al módulo de directivas. El módulo de directiva puede volver a examinar la solicitud, acceder a los datos externos necesarios y devolver un valor para indicar que se debe emitir o denegar el certificado.

Al escribir módulos de directiva personalizados, debe implementar la funcionalidad VerifyRequest en los módulos.

Ejemplos

En el ejemplo siguiente se muestra una posible implementación del 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 Value
Cliente mínimo compatible No se admite ninguno
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado certpol.h (incluya Certsrv.h)
Library Certidl.lib

Consulte también

ICertConfig

ICertPolicy

ICertPolicy2