Vorgehensweise: Prüfen des Sicherheitskontexts

Beim Programmieren von Windows Communication Foundation (WCF)-Diensten können Sie mit dem Dienstsicherheitskontext genaue Informationen über die Clientanmeldeinformationen und Ansprüche bestimmen, die für die Authentifizierung des Diensts benötigt werden. Dies geschieht anhand der Eigenschaften der ServiceSecurityContext-Klasse.

So können Sie z. B. die Identität des aktuellen Clients mit der PrimaryIdentity-Eigenschaft oder der WindowsIdentity-Eigenschaft abrufen. Mit der IsAnonymous-Eigenschaft können Sie ermitteln, ob der Client anonym ist.

Sie können auch bestimmen, welche Ansprüche im Namen des Clients gestellt werden, indem Sie die Auflistung der Ansprüche der AuthorizationContext-Eigenschaft durchlaufen.

So rufen Sie den aktuellen Sicherheitskontext ab

  • Greifen Sie auf die statische Current- Eigenschaft zu, um den aktuellen Sicherheitskontext abzurufen. Überprüfen Sie eine beliebige der Eigenschaften des aktuellen Kontexts für den Verweis.

So ermitteln Sie die Identität des Aufrufers

  1. Drucken Sie den Wert der PrimaryIdentity-Eigenschaft und der WindowsIdentity-Eigenschaft.

So analysieren Sie die Ansprüche eines Aufrufers

  1. Geben Sie die aktuelle AuthorizationContext-Klasse zurück. Verwenden Sie die Current-Eigenschaft, um den aktuellen Dienstsicherheitskontext zurückzugeben, geben Sie dann den AuthorizationContext mit der AuthorizationContext-Eigenschaft zurück.

  2. Analysieren Sie die Auflistung der ClaimSet-Objekte, die von der ClaimSets-Eigenschaft der AuthorizationContext-Klasse zurückgegeben werden.

Beispiel

Im folgenden Beispiel werden die Werte der WindowsIdentity-Eigenschaft und der PrimaryIdentity-Eigenschaft des aktuellen Sicherheitskontexts und der ClaimType-Eigenschaft gedruckt sowie der Ressourcenwert des Anspruchs und die Right-Eigenschaft jedes Anspruchs im aktuellen Sicherheitskontext.

// 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

Kompilieren des Codes

Der Code verwendet die folgenden Namespaces:

Siehe auch