Condividi tramite


Procedura: creare una credenziale di supporto

È possibile avere uno schema di sicurezza personalizzato che richiede più di una credenziale. Ad esempio, è possibile che un servizio richieda a un client non solo un nome utente e una password, ma anche una credenziale che dimostri che l'utente del client abbia un'età superiore a 18 anni. La seconda credenziale è una credenziale di supporto. Questo argomento illustra come implementare tali credenziali in un client Windows Communication Foundation (WCF).

Nota

La specifica per supportare le credenziali è parte della specifica SecurityPolicy-WS. Per altre informazioni, vedere Specifiche di sicurezza dei servizi Web.

Token di supporto

In breve, quando si usa la sicurezza dei messaggi, viene sempre usata una credenziale primaria per proteggere il messaggio, ad esempio, un certificato X.509 o un ticket Kerberos.

Come definito dalla specifica, un'associazione di sicurezza usa token per proteggere lo scambio di messaggi. Un token è una rappresentazione di una credenziale di sicurezza.

L'associazione di sicurezza usa un token primario identificato nei criteri dell'associazione di sicurezza per creare una firma. Questa firma viene definita firma del messaggio.

È possibile specificare token aggiuntivi per aumentare le attestazioni fornite dal token associato alla firma del messaggio.

Verifica dell'autenticità, firma e crittografia

Una credenziale di supporto produce un token di supporto trasmesso all'interno del messaggio. La specifica WS-SecurityPolicy definisce quattro modalità per allegare un token di supporto al messaggio, come descritto nella tabella seguente.

Scopo Descrizione
Con segno Il token di supporto viene incluso nell'intestazione di sicurezza e viene firmato con la firma del messaggio.
Verifica dell'autenticità Un token di verifica dell'autenticità firma la firma del messaggio.
Firmato e di verifica dell'autenticità I token di verifica dell'autenticità firmati firmano l'intero elemento ds:Signature prodotto dalla firma del messaggio e sono essi stessi firmati con la firma del messaggio; ovvero, entrambi i token, quello usato per la firma del messaggio e quello di verifica dell'autenticità firmato, si firmano l'un l'altro.
Firmato e di crittografia I token di supporto crittografati firmati sono token di supporto firmati che vengono anche crittografati quando sono presenti in wsse:SecurityHeader.

Programmazione di credenziali di supporto

Per creare un servizio che usa token di supporto, è necessario creare un <customBinding>. (Per maggiori informazioni, vedere Procedura: Creare un'associazione personalizzata usando SecurityBindingElement).

Quando si crea un'associazione personalizzata, il primo passaggio consiste nel creare un elemento di associazione di sicurezza che può essere di uno dei tre tipi seguenti:

Tutte le classi ereditano da SecurityBindingElement, che include quattro proprietà rilevanti:

Ambiti

Esistono due ambiti per le credenziali di supporto:

  • I token di supporto endpoint supportano tutte le operazioni di un endpoint. In altre parole, la credenziale rappresentata dal token di supporto può essere usata ogni volta che vengono richiamate le operazioni di un endpoint.

  • I token di supporto operazioni supportano solo una specifica operazione dell'endpoint.

Come indicato dai nomi delle proprietà, le credenziali di supporto possono essere obbligatorie o facoltative. In altre parole, se la credenziale di supporto viene usata se presente, anche se non necessaria, l'autenticazione non avrà esito negativo se la credenziale non è presente.

Procedure

Per creare un'associazione personalizzata che includa credenziali di supporto

  1. Creare un elemento di associazione di sicurezza. Nell'esempio seguente viene creata una classe SymmetricSecurityBindingElement con la modalità di autenticazione UserNameForCertificate. Usare il metodo CreateUserNameForCertificateBindingElement.

  2. Aggiungere il parametro di supporto alla raccolta dei tipi restituita dalla proprietà appropriata (Endorsing, Signed, SignedEncrypted o SignedEndorsed). I tipi nello spazio dei nomi System.ServiceModel.Security.Tokens includono tipi comunemente usati, ad esempio X509SecurityTokenParameters.

Esempio

Descrizione

Nell'esempio seguente viene creata un'istanza della classe SymmetricSecurityBindingElement e viene aggiunta un'istanza della classe KerberosSecurityTokenParameters alla raccolta della proprietà Endorsing restituita.

Codice

public static Binding CreateMultiFactorAuthenticationBinding()
{
    HttpTransportBindingElement httpTransport = new HttpTransportBindingElement();

    // The message security binding element will be configured to require 2 tokens:
    // 1) A user name/password encrypted with the service token.
    // 2) A client certificate used to sign the message.

    // Instantiate a binding element that will require the user name/password token
    // in the message (encrypted with the server certificate).
    SymmetricSecurityBindingElement messageSecurity = SecurityBindingElement.CreateUserNameForCertificateBindingElement();

    // Create supporting token parameters for the client X.509 certificate.
    X509SecurityTokenParameters clientX509SupportingTokenParameters = new X509SecurityTokenParameters();
    // Specify that the supporting token is passed in the message send by the client to the service.
    clientX509SupportingTokenParameters.InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;
    // Turn off derived keys.
    clientX509SupportingTokenParameters.RequireDerivedKeys = false;
    // Augment the binding element to require the client's X.509 certificate as an
    // endorsing token in the message.
    messageSecurity.EndpointSupportingTokenParameters.Endorsing.Add(clientX509SupportingTokenParameters);

    // Create a CustomBinding based on the constructed security binding element.
    return new CustomBinding(messageSecurity, httpTransport);
}

Vedi anche