ServiceSecurityContext Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
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.
Modalità cookie e proprietà IsAuthenticated
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'attributorequireSecurityContextCancellation
impostato sufalse
.
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) |