Compartir a través de


Cómo: Trabajar con firmas digitales con el modelo de objetos de InfoPath 2003

El modelo de objetos compatible con InfoPath 2003 proporciona características para trabajar con firmas digitales mediante programación.

Características de las firmas digitales

Las características de firmas digitales disponibles en InfoPath permiten:

  • Habilitar las firmas para todo el formulario o para conjuntos específicos de datos del formulario que se puedan firmar por separado.

  • Especificar, por cada conjunto de datos que se pueda firmar, si se permiten una o varias firmas y la relación que tendrán. Por ejemplo, puede indicar si son cofirmas en paralelo o si cada nueva firma contrafirma todas las anteriores.

  • Especificar un mensaje que se va a mostrar a los usuarios del formulario cuando lo firmen.

  • Insertar y ver una firma en el documento.

  • Ver la información de no incumplimiento comprobable que se ha añadido a cada firma para incrementar la seguridad. Esta información adicional, que incluye una vista del formulario tal como se ha presentado a cada firmante, es una parte de la firma y no se puede quitar sin invalidar ésta. En cualquier momento, puede recuperar estos datos haciendo clic en la firma del formulario para mostrar el cuadro de diálogo Comprobar firma digital.

  • Sacar partido de un modelo de objetos para trabajar con firmas digitales. Añadir información personalizada al bloque de la firma de los formularios de plena confianza mediante el modelo de objetos de firmas digitales.

Información general sobre el modelo de objetos de firmas digitales

Eventos

El modelo de objetos de firmas digitales proporciona el siguiente evento.

Nombre Descripción

OnSign

Se produce después de seleccionar un conjunto de datos para firmarlos.

Puede utilizar este evento para manipular los datos almacenados en la firma digital. Por ejemplo, se pueden agregar datos de un servidor de marca de hora de confianza o agregar una contrafirma del servidor de la transacción. Asimismo, se puede usar este evento para bloquear la firma si el usuario actual no es integrante de un grupo determinado.

El evento OnSign devuelve una referencia al objeto SignEventObject, que proporciona las siguientes propiedades.

Nombre Descripción

ReturnStatus

Obtiene o establece un valor Boolean que indica el estado de retorno del evento OnSign.

SignedDataBlock

Obtiene el bloque de datos firmados que desencadenó el evento OnSign.

XDocument

Obtiene una referencia al objeto XDocument asociado al evento OnSign.

Colecciones y objetos

El modelo de objetos de firmas digitales proporciona las siguientes colecciones.

Nombre Descripción

SignedDataBlocksCollection

Colección de objetos SignedDataBlockObject tal como se define en el archivo de definición de formularios (.xsf).

La colección SignedDataBlocksCollection implementa propiedades que se pueden usar para obtener acceso a los objetos SignedDataBlockObjects asociados con un formulario. El acceso a la colección SignedDataBlocks se obtiene mediante la propiedad SignedDataBlocks del objeto XDocument.

SignaturesCollection

Contiene una colección de objetos SignatureObject para cada SignedDataBlockObject del formulario.

La colección SignaturesCollection implementa propiedades y un método que sebpueden usar para obtener acceso a objetos SignatureObject asociados con el formulario y crear una firma. Se puede obtener acceso a esta colección mediante el objeto SignedDataBlockObject.

Cuando utilice el método Create de la colección SignaturesCollection, tenga en cuenta que la firma no se escribe hasta que se llama al métodoSign en el objeto SignatureObject. Sólo se pueden llamar estos métodos desde el controlador de eventos OnSign de una plantilla de formulario de plena confianza.

El modelo de objetos de firmas digitales proporciona los siguientes objetos.

Nombre Descripción

SignedDataBlockObject

Representa un conjunto de datos que se pueden firmar en un formulario. El objeto SignedDataBlock proporciona una serie de propiedades y un método que se pueden usar para interactuar mediante programación con un conjunto de datos que se pueden firmar.

SignatureObject

Representa una firma digital añadida a un formulario o a un conjunto de datos que se pueden firmar de un formulario. La colección SignatureObject implementa propiedades que se pueden utilizar para recuperar información sobre la firma digital y el método Sign para escribir el bloque de firma digital XML y computar su valor hash digital cifrado.

CertificateObject

Representa el certificado digital X.509 utilizado para crear la firma.

Trabajar con firmas digitales mediante programación

El modelo de objetos compatible con InfoPath 2003 ofrece miembros para interactuar con las firmas digitales mediante programación. Concretamente, los formularios de plena confianza pueden añadir información personalizada al bloque de la firma antes de confirmarlo, de acuerdo con la siguiente escala de tiempo:

  1. El usuario elige agregar una firma digital a un formulario.

  2. Se muestra el primer panel del Asistente para firmas digitales.

  3. Se inicia el evento OnSign de los datos seleccionados que representa el objeto SignedDataBlockObject y se ejecutan el método Sign de SignedDataBlockObject y el método Create de SignaturesCollection.

  4. Se ejecutan todas las acciones personalizadas opcionales.

  5. Se ejecuta el método Sign de SignatureObject.

  6. Se muestran el segundo y el tercer panel del asistente para seleccionar el certificado de la firma y escribir comentarios.

  7. Se muestra la información de no incumplimiento (que se puede ver más tarde con el cuadro de diálogo Comprobar firma digital).

  8. Al hacer clic en el botón Firmar, se agrega la firma a la colección de firmas del formulario.

En el ejemplo siguiente se invoca el cuadro de diálogo Firmar y se contrafirma la firma con un valor de marca de hora recuperado de un servicio de marca de hora de confianza.

[InfoPathEventHandler(EventType=InfoPathEventType.OnSign)]
public void OnSign(SignEvent e)
{
    Signature signature = e.SignedDataBlock.Signatures.Create();
    // Invoke the Sign dialog box to sign the data block.
    signature.Sign();
    // Countersign the signature with a trusted timestamp
    // Get the XML node storing the signature block
    IXMLDOMNode oNodeSig = signature.SignatureBlockXmlNode;
    IXMLDOMNode oNodeSigValue = oNodeSig.selectSingleNode(".//*[local-name(.)='signatureValue']");
    // Get timestamp from a trusted timestamp service (fictitious).
    MyTrustedTimeStampService s = new MyTrustedTimeStampService();
    string strVerifiedTimeStamp = s.AddTimeStamp(oNodeSigValue.text);
    
    //Add the value returned from the timestamp service to the 
    //unsigned part of the signature block
    IXMLDOMNode oNodeObj = oNodeSig.selectSingleNode(".//*[local-name(.)='Object']");
    IXMLDOMNode oNode = oNodeObj.cloneNode(false);
    oNode.text = strVerifiedTimeStamp;
    oNodeObj.parentNode.appendChild(oNode);

    e.ReturnStatus = true;
}