Procedura: Utilizzare firme digitali tramite il modello a oggetti di InfoPath 2003
Il modello a oggetti compatibile con InfoPath 2003 offre funzionalità per l'utilizzo di firme digitali a livello di programmazione.
Funzionalità relative alle firme digitali
Le funzionalità relative alle firme digitali disponibili in InfoPath consentono di eseguire le operazioni seguenti:
Attivare firme per l'intero modulo o per blocchi di dati specifici nel modulo che possono essere firmati separatamente.
Specificare, per ogni blocco di dati set di dati che può essere firmato, se sono consentite più firme o una sola firma e le relative relazioni. È possibile, ad esempio, impostare firme parallele (co-firma) o firme separate in cui ogni nuova firma controfirma tutte le firme precedenti.
Impostare un messaggio da visualizzare quando gli utenti firmano il modulo.
Inserire e visualizzare una firma nel documento.
Visualizzare le informazioni di non ripudio verificabili aggiunte a ogni firma per una maggiore protezione. Queste informazioni aggiuntive, comprendenti una visualizzazione del modulo presentato a ogni firmatario, fanno parte della firma e se vengono rimosse invalidano la firma. In qualsiasi momento è possibile richiamare questi dati facendo clic sulla firma nel modulo per visualizzare la finestra di dialogo Verifica firma digitale.
Utilizzare un modello a oggetti per gestire le firme digitali e aggiungere informazioni personalizzate al blocco di firma nei moduli completamente attendibili tramite il modello a oggetti per la gestione delle firme digitali.
Informazioni generali sul modello a oggetti per la gestione delle firme digitali
Eventi
Il modello a oggetti per le firme digitali implementa l'evento seguente.
Nome | Descrizione |
---|---|
Viene generato dopo la selezione per la firma di un blocco di dati firmabile. È possibile utilizzare questo evento per intervenire sui dati archiviati con la firma digitale. Ad esempio, si possono aggiungere dati da un server timestamp attendibile oppure aggiungere una controfirma della transazione sul lato server. È inoltre possibile utilizzare questo evento per una firma di blocco se l'utente corrente non è incluso in un particolare gruppo. |
L'evento OnSign restituisce un riferimento all'oggetto SignEventObject, che implementa le proprietà seguenti.
Nome | Descrizione |
---|---|
Ottiene o imposta un valore Boolean che indica lo stato restituito dell'evento OnSign. |
|
Ottiene il blocco di dati firmati che ha attivato l'evento OnSign. |
|
Ottiene un riferimento all'oggetto XDocument associato all'evento OnSign. |
Insiemi e oggetti
Il modello a oggetti per le firme digitali implementa gli insiemi seguenti.
Nome | Descrizione |
---|---|
Insieme degli oggetti SignedDataBlockObject nel modello di modulo in base a quanto definito nel file di definizione del modulo, con estensione xsf. L'insieme SignedDataBlocksCollection implementa proprietà che consentono di accedere agli oggetti SignedDataBlockObjects associati a un modulo. All'insieme SignedDataBlocks è possibile accedere tramite la proprietà SignedDataBlocks dell'oggetto XDocument. |
|
Contiene un insieme di oggetti SignatureObject per ogni oggetto SignedDataBlockObject nel modulo. L'insieme SignaturesCollection implementa proprietà e un metodo che consentono di accedere agli oggetti SignatureObject associati a un modulo e creare una firma. All'insieme è possibile accedere tramite l'oggetto SignedDataBlockObject. Quando si utilizza il metodo Create dell'insieme SignaturesCollection, è importante ricordare che la firma non viene apposta finché non viene richiamato il metodo Sign per l'oggetto SignatureObject. Questi metodi possono essere richiamati solo dal gestore eventi di un modello di modulo completamente attendibileOnSign. |
Il modello a oggetti per le firme digitali implementa gli oggetti seguenti.
Nome | Descrizione |
---|---|
SignedDataBlockObject |
Rappresenta un blocco di dati firmabile in un modulo. L'oggetto SignedDataBlock implementa numerose proprietà e un metodo che possono essere utilizzati per interagire a livello di programmazione con un blocco di dati firmabile. |
SignatureObject |
Rappresenta una firma digitale che è stata aggiunta a un modulo o un blocco di dati firmabile in un modulo. L'insieme SignatureObject implementa proprietà che consentono di recuperare informazioni sulla firma digitale e il metodo Sign per la scrittura del blocco di firma digitale XML e il calcolo del valore dell'hash crittografico. |
Rappresenta il certificato digitale X.509 utilizzato per creare la firma. |
Gestione delle firme digitali a livello di programmazione
Il modello a oggetti compatibile con InfoPath 2003 implementa membri che consentono l'interazione con firme digitali a livello di programmazione. In particolare, i moduli completamente attendibili possono aggiungere informazioni personalizzate al blocco di firma prima del commit, in base alla sequenza seguente:
L'utente decide di aggiungere una firma digitale a un modulo.
Viene visualizzata la prima finestra dell'Aggiunta guidata firma digitale.
Viene generato l'evento OnSign per i dati selezionati rappresentati dall'oggetto SignedDataBlockObject e vengono eseguiti il metodo Sign dell'oggetto SignedDataBlockObject e il metodo Create dell'insieme SignaturesCollection.
Vengono eseguite eventuali azioni facoltative personalizzate.
Viene eseguito il metodo Sign dell'oggetto SignatureObject.
Vengono visualizzate la seconda e la terza finestra della procedura guidata, in cui è possibile selezionare un certificato per la firma e immettere i commenti.
Vengono visualizzate le informazioni di non ripudio, che in seguito potranno essere visualizzate nella finestra di dialogo Verifica firma digitale.
Quando si fa clic su Firma, la firma viene aggiunta all'insieme di firme per il modulo.
Nell'esempio seguente viene richiamata la finestra di dialogo Firma (Sign) e viene applicata una controfirma alla firma con un valore timestamp recuperato da un servizio timestamp attendibile.
[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;
}