Condividi tramite


ServiceSecurityContext Classe

Definizione

Rappresenta il contesto di sicurezza di una parte remota. Nel client rappresenta l'identità del servizio, mentre nel servizio rappresenta l'identità del client.

public ref class ServiceSecurityContext
public class ServiceSecurityContext
type ServiceSecurityContext = class
Public Class ServiceSecurityContext
Ereditarietà
ServiceSecurityContext

Esempio

Nell'esempio seguente la classe ServiceSecurityContext viene utilizzata per fornire informazioni sul contesto di sicurezza corrente. Il codice crea un'istanza della classe StreamWriter per scrivere le informazioni in un file.

// When this method runs, the caller must be an authenticated user
// and the ServiceSecurityContext is not a null instance.
public double Add(double n1, double n2)
{
    // Write data from the ServiceSecurityContext to a file using the StreamWriter class.
    using (StreamWriter sw = new StreamWriter(@"c:\ServiceSecurityContextInfo.txt"))
    {
        // 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);

        // 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}, Resource: {1} Right: {2}",
                    claim.ClaimType,
                    claim.Resource.ToString(),
                    claim.Right);
                sw.WriteLine();
            }
        }
    }
    return n1 + n2;
}
' When this method runs, the caller must be an authenticated user and the ServiceSecurityContext 
' is not a null instance. 
Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add
    ' Write data from the ServiceSecurityContext to a file using the StreamWriter class.
    Dim sw As New StreamWriter("c:\ServiceSecurityContextInfo.txt")
    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)

        ' 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}, Resource: {1} Right: {2}", _
                claim.ClaimType, _
                claim.Resource.ToString(), _
                claim.Right)
                sw.WriteLine()
            Next claim
        Next claimset
    Finally
        sw.Dispose()
    End Try
    Return n1 + n2
End Function

Nell'esempio seguente viene mostrata un'implementazione del metodo CheckAccessCore che utilizza il contesto ServiceSecurityContext per analizzare un set di attestazioni.

public class MyServiceAuthorizationManager : ServiceAuthorizationManager
{
    protected override bool CheckAccessCore(OperationContext operationContext)
    {
        // Extract the action URI from the OperationContext. Match this against the claims
        // in the AuthorizationContext.
        string action = operationContext.RequestContext.RequestMessage.Headers.Action;
        Console.WriteLine("action: {0}", action);

        // Iterate through the various claimsets in the AuthorizationContext.
        foreach(ClaimSet cs in operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets)
        {
            // Examine only those claim sets issued by System.
            if (cs.Issuer == ClaimSet.System)
            {
                // Iterate through claims of type "http://example.org/claims/allowedoperation".
                foreach (Claim c in cs.FindClaims("http://example.org/claims/allowedoperation",
                    Rights.PossessProperty))
                {
                    // Write the Claim resource to the console.
                    Console.WriteLine("resource: {0}", c.Resource.ToString());

                    // If the Claim resource matches the action URI then return true to allow access.
                    if (action == c.Resource.ToString())
                        return true;
                }
            }
        }

        // If this point is reached, return false to deny access.
         return false;
    }
}
Public Class MyServiceAuthorizationManager
    Inherits ServiceAuthorizationManager
    
    Protected Overrides Function CheckAccessCore(ByVal operationContext As OperationContext) As Boolean 
        ' Extract the action URI from the OperationContext. Match this against the claims
        ' in the AuthorizationContext.
        Dim action As String = operationContext.RequestContext.RequestMessage.Headers.Action
        Console.WriteLine("action: {0}", action)
        
        ' Iterate through the various claimsets in the authorizationcontext.
        Dim cs As ClaimSet
        For Each cs In  operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets
            ' Examine only those claim sets issued by System.
            If cs.Issuer Is ClaimSet.System Then
                ' Iterate through claims of type "http://example.org/claims/allowedoperation".
                Dim c As Claim
                For Each c In  cs.FindClaims("http://example.org/claims/allowedoperation", _
                        Rights.PossessProperty)
                    ' Write the Claim resource to the console.
                    Console.WriteLine("resource: {0}", c.Resource.ToString())
                    
                    ' If the Claim resource matches the action URI then return true to allow access.
                    If action = c.Resource.ToString() Then
                        Return True
                    End If
                Next c
            End If
        Next cs 
        ' If we get here, return false, denying access.
        Return False
    
    End Function 
End Class

Commenti

I dati sono parte della proprietà SecurityMessageProperty di un messaggio.

Usare questa classe per ottenere informazioni su un contesto di sicurezza remoto in fase di esecuzione. Un contesto di sicurezza viene creato quando un client viene autenticato correttamente e viene autorizzato ad accedere a un metodo. Quando un messaggio viene autenticato e autorizzato correttamente, per ottenere le informazioni sulla sicurezza contenute nel client e relative all'istanza del servizio corrente è possibile utilizzare un'istanza di questa classe.

È possibile recuperare un'istanza di ServiceSecurityContext dalla proprietà Current della classe OperationContext oppure utilizzarla tramite un metodo dell'operazione di servizio, come illustrato nell'esempio seguente.

Analisi di un set di attestazioni

Un utilizzo comune della classe consiste nel recuperare il set corrente di attestazioni allo scopo di identificare o autorizzare un client quando quest'ultimo accede a un metodo. La classe ClaimSet contiene una raccolta di oggetti Claim, ognuno dei quali può essere analizzato per determinare se esiste una determinata attestazione. Se l'attestazione è presente, l'autorizzazione può essere concessa. Questa funzionalità è fornita tramite l'override del metodo CheckAccessCore della classe ServiceAuthorizationManager. Per un esempio completo, vedere Criteri di autorizzazione.

Si noti che in determinate circostanze la proprietà IsAuthenticated dell'interfaccia IIdentity restituisce true anche se il client remoto è autenticato come utente anonimo. La PrimaryIdentity proprietà restituisce un'implementazione dell'interfaccia IIdentity . Le circostanze seguenti devono essere vere per questo problema:

  • Il servizio utilizza l'autenticazione Windows.

  • Il servizio consente gli accessi anonimi.

  • L'associazione è un <customBinding>.

  • L'associazione personalizzata comprende un elemento <security>.

  • L'elemento <security> include un <secureConversationBootstrap> con l'attributo requireSecurityContextCancellation impostato su false.

Costruttori

ServiceSecurityContext(AuthorizationContext)

Consente di inizializzare una nuova istanza della classe ServiceSecurityContext con i parametri di autorizzazione specificati.

ServiceSecurityContext(AuthorizationContext, ReadOnlyCollection<IAuthorizationPolicy>)

Consente di inizializzare una nuova istanza della classe ServiceSecurityContext con i parametri di autorizzazione e la raccolta di criteri specificati.

ServiceSecurityContext(ReadOnlyCollection<IAuthorizationPolicy>)

Consente di inizializzare una nuova istanza della classe ServiceSecurityContext con l'oggetto costituito dalla raccolta di criteri.

Proprietà

Anonymous

Restituisce un'istanza della classe ServiceSecurityContext contenente una raccolta vuota di attestazioni, identità e di altri dati di contesto che in genere è utilizzata per rappresentare una parte anonima.

AuthorizationContext

Consente di ottenere le informazioni sull'autorizzazione di un'istanza di questa classe. Il contesto AuthorizationContext contiene una raccolta di oggetti ClaimSet interrogabile dall'applicazione per recuperare le informazioni sulla parte.

AuthorizationPolicies

Consente di ottenere la raccolta di criteri associata a un'istanza di questa classe.

Current

Ottiene l'oggetto ServiceSecurityContext corrente.

IsAnonymous

Consente di ottenere un valore che indica se il client corrente ha fornito le credenziali al servizio.

PrimaryIdentity

Consente di ottenere l'identità primaria associata all'impostazione corrente.

WindowsIdentity

Consente di ottenere l'identità Windows dell'impostazione corrente.

Metodi

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetType()

Ottiene l'oggetto Type dell'istanza corrente.

(Ereditato da Object)
MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.

(Ereditato da Object)
ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Si applica a

Vedi anche