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
- Stampare il valore delle proprietà PrimaryIdentity e WindowsIdentity.
Per analizzare le attestazioni di un chiamante
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.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: