Condividi tramite


Procedura: esaminare il contesto di sicurezza

Durante la programmazione di servizi Windows Communication Foundation (WCF), il contesto di sicurezza del servizio consente di determinare dettagli sulle credenziali client e sulle attestazioni utilizzate per l'autenticazione con il servizio. A tale fine, utilizzare le proprietà della classe ServiceSecurityContext.

È ad esempio possibile recuperare l'identità del client corrente utilizzando PrimaryIdentity o la proprietà WindowsIdentity. Per determinare se il client è anonimo, utilizzare la proprietà IsAnonymous.

È inoltre possibile determinare quali sono le attestazioni eseguite per conto del client eseguendo un'iterazione nella raccolta di attestazioni nella proprietà AuthorizationContext.

Per ottenere il contesto di sicurezza corrente

  • Accedere alla proprietà Current statica per ottenere il contesto di sicurezza corrente. Esaminare qualsiasi proprietà del contesto corrente dal riferimento.

Per determinare l'identità del chiamante

  1. Stampare il valore delle proprietà PrimaryIdentity e WindowsIdentity.

Per analizzare le attestazioni di un chiamante

  1. Restituire la classe AuthorizationContext corrente. Utilizzare la proprietà Current per restituire il contesto di sicurezza del servizio corrente, quindi restituire AuthorizationContext utilizzando la proprietà AuthorizationContext.

  2. Analizzare la raccolta di oggetti ClaimSet restituiti dalla proprietà ClaimSets della classe AuthorizationContext.

Esempio

Nell'esempio seguente vengono stampati i valori delle proprietà WindowsIdentity e PrimaryIdentity del contesto di sicurezza corrente e la proprietà ClaimType, il valore della risorsa dell'attestazione e la proprietà Right di ogni attestazione nel contesto di sicurezza corrente.

// Run this method from within a method protected by the PrincipalPermissionAttribute
// to see the security context data, including the primary identity.
public void WriteServiceSecurityContextData(string fileName)
{
    using (StreamWriter sw = new StreamWriter(fileName))
    {
        // Write the primary identity and Windows identity. The primary identity is derived from
        // the credentials used to authenticate the user. The Windows identity may be a null string.
        sw.WriteLine("PrimaryIdentity: {0}", ServiceSecurityContext.Current.PrimaryIdentity.Name);
        sw.WriteLine("WindowsIdentity: {0}", ServiceSecurityContext.Current.WindowsIdentity.Name);
        sw.WriteLine();
        // Write the claimsets in the authorization context. By default, there is only one claimset
        // provided by the system.
        foreach (ClaimSet claimset in ServiceSecurityContext.Current.AuthorizationContext.ClaimSets)
        {
            foreach (Claim claim in claimset)
            {
                // Write out each claim type, claim value, and the right. There are two
                // possible values for the right: "identity" and "possessproperty".
                sw.WriteLine("Claim Type = {0}", claim.ClaimType);
                sw.WriteLine("\t Resource = {0}", claim.Resource.ToString());
                sw.WriteLine("\t Right = {0}", claim.Right);
            }
        }
    }
}

' Run this method from within a method protected by the PrincipalPermissionAttribute
' to see the security context data, including the primary identity.
Public Sub WriteServiceSecurityContextData(ByVal fileName As String)
    Dim sw As New StreamWriter(fileName)
    Try
        ' Write the primary identity and Windows identity. The primary identity is derived from 
        ' the credentials used to authenticate the user. The Windows identity may be a null string.
        sw.WriteLine("PrimaryIdentity: {0}", ServiceSecurityContext.Current.PrimaryIdentity.Name)
        sw.WriteLine("WindowsIdentity: {0}", ServiceSecurityContext.Current.WindowsIdentity.Name)
        sw.WriteLine()
        ' Write the claimsets in the authorization context. By default, there is only one claimset
        ' provided by the system. 
        Dim claimset As ClaimSet
        For Each claimset In ServiceSecurityContext.Current.AuthorizationContext.ClaimSets
            Dim claim As Claim
            For Each claim In claimset
                ' Write out each claim type, claim value, and the right. There are two
                ' possible values for the right: "identity" and "possessproperty". 
                sw.WriteLine("Claim Type = {0}", claim.ClaimType)
                sw.WriteLine(vbTab + " Resource = {0}", claim.Resource.ToString())
                sw.WriteLine(vbTab + " Right = {0}", claim.Right)
            Next claim
        Next claimset
    Finally
        sw.Dispose()
    End Try

End Sub

Compilazione del codice

Il codice utilizza gli spazi dei nomi seguenti:

Vedi anche