ServiceSecurityContext Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Representa el contexto de seguridad de una parte remota. En el lado del cliente, representa la identidad del servicio y, en el del servicio, la identidad del cliente.
public ref class ServiceSecurityContext
public class ServiceSecurityContext
type ServiceSecurityContext = class
Public Class ServiceSecurityContext
- Herencia
-
ServiceSecurityContext
Ejemplos
El ejemplo siguiente utiliza la clase ServiceSecurityContext para proporcionar información sobre el contexto de seguridad actual. El código crea una instancia de la clase StreamWriter para escribir la información en un archivo.
// 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
El ejemplo siguiente muestra una implementación del método CheckAccessCore que utiliza ServiceSecurityContext para analizar un conjunto de notificaciones.
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
Comentarios
Los datos forman parte de SecurityMessageProperty para un mensaje.
Use esta clase para obtener información sobre un contexto de seguridad remota en tiempo de ejecución. Se crea un contexto de seguridad cuando se autentica y autoriza un cliente correctamente para tener acceso a un método. Cuando un mensaje se autentica y autoriza correctamente, la información de seguridad del cliente y para la instancia del servicio actual se puede obtener de una instancia de esta clase.
Puede recuperar una instancia de ServiceSecurityContext de la propiedad Current de la clase OperationContext o utilizarla desde un método de operación de servicio, como se muestra en el siguiente ejemplo.
Análisis de un ClaimSet
Un uso común de la clase consiste en recuperar el conjunto actual de notificaciones con el propósito de identificar o autorizar a un cliente cuando acceda a un método. La clase ClaimSet contiene una colección de objetos Claim y cada uno se puede analizar para determinar si está presente una notificación concreta. Si se proporciona la notificación especificada, se puede otorgar la autorización. Esta funcionalidad se ofrece mediante la sustitución del método CheckAccessCore de la clase ServiceAuthorizationManager. Para obtener un ejemplo completo, consulte la directiva de autorización.
Modo de cookie e IsAuthenticated
Observe que en algunas circunstancias, la propiedad IsAuthenticated de la interfaz IIdentity devuelve true
aun cuando el cliente remoto se autentique como un usuario anónimo. (La PrimaryIdentity propiedad devuelve una implementación de la IIdentity interfaz). Las circunstancias siguientes deben cumplirse para que esto ocurra:
El servicio utiliza la autenticación de Windows.
El servicio permite inicios de sesión anónimos.
El enlace es un <customBinding>.
El enlace personalizado incluye un elemento
<security>
.El
<security>
elemento incluye secureConversationBootstrap<> con elrequireSecurityContextCancellation
atributo establecido enfalse
.
Constructores
ServiceSecurityContext(AuthorizationContext) |
Inicializa una nueva instancia de la clase ServiceSecurityContext con los parámetros de autorización especificados. |
ServiceSecurityContext(AuthorizationContext, ReadOnlyCollection<IAuthorizationPolicy>) |
Inicializa una nueva instancia de la clase ServiceSecurityContext con los parámetros de autorización y la colección de directivas especificados. |
ServiceSecurityContext(ReadOnlyCollection<IAuthorizationPolicy>) |
Inicializa una nueva instancia de la clase ServiceSecurityContext con la colección de objetos de directivas. |
Propiedades
Anonymous |
Devuelve una instancia de la clase ServiceSecurityContext que contiene una colección vacía de notificaciones, identidades y otros datos de contexto que normalmente se utiliza para representar una parte anónima. |
AuthorizationContext |
Obtiene la información de autorización para una instancia de esta clase. AuthorizationContext contiene una colección de ClaimSet que la aplicación puede interrogar y recuperar la información de la parte. |
AuthorizationPolicies |
Obtiene la colección de directivas asociada a una instancia de esta clase. |
Current |
Obtiene la estructura ServiceSecurityContext actual. |
IsAnonymous |
Obtiene un valor que indica si el cliente actual ha proporcionado las credenciales al servicio. |
PrimaryIdentity |
Obtiene la identidad primaria asociada con el valor actual. |
WindowsIdentity |
Obtiene la identidad de Windows del valor actual. |
Métodos
Equals(Object) |
Determina si el objeto especificado es igual que el objeto actual. (Heredado de Object) |
GetHashCode() |
Sirve como la función hash predeterminada. (Heredado de Object) |
GetType() |
Obtiene el Type de la instancia actual. (Heredado de Object) |
MemberwiseClone() |
Crea una copia superficial del Object actual. (Heredado de Object) |
ToString() |
Devuelve una cadena que representa el objeto actual. (Heredado de Object) |