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
- Drucken Sie den Wert der PrimaryIdentity-Eigenschaft und der WindowsIdentity-Eigenschaft.
So analysieren Sie die Ansprüche eines Aufrufers
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.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: