Procedimiento para crear una notificación personalizada
La infraestructura del modelo de identidad de Windows Communication Foundation (WCF) proporciona un conjunto de derechos y tipos de notificación integrados con las funciones auxiliares para crear instancias de Claim con esos tipos y derechos. Estas notificaciones integradas están diseñadas para modelar la información encontrada en los tipos de credencial de cliente que admite WCF de forma predeterminada. En muchos casos, las demandas integradas son suficientes; sin embargo, algunas aplicaciones pueden exigir demandas personalizadas. Una demanda está compuesta por el tipo de demanda, el recurso para el que la demanda se aplica y el derecho que se impone sobre ese recurso. En este tema se describe cómo crear una demanda personalizada.
Para crear una demanda personalizada que está basada en un tipo de datos primitivo
Cree una demanda personalizada pasando el tipo de demanda, valor de recurso y derecho al constructor Claim(String, Object, String).
Seleccione un valor único para el tipo de demanda.
El tipo de demanda es un identificador de cadena único. Es la responsabilidad del diseñador de la demanda personalizada asegurar que el identificador de cadena que se usa para el tipo de demanda sea único. Para ver una lista de tipos de notificación definidos por WCF, consulte la clase ClaimTypes.
Elija el tipo de datos primitivo y el valor para el recurso.
Un recurso es un objeto. El tipo CLR del recurso puede ser primitivo, como String o Int32, así como cualquier tipo serializable. El tipo CLR del recurso debe ser serializable, porque WCF serializa las notificaciones en varios puntos. Los tipos primitivos son serializables.
Elija un derecho definido por WCF o un valor único para un derecho personalizado.
Un derecho es un identificador de cadena único. Los derechos definidos por WCF se definen en la clase Rights.
Es la responsabilidad del diseñador de la demanda personalizada asegurar que el identificador de cadena que se usa para el derecho sea único.
El ejemplo de código siguiente crea una demanda personalizada con un tipo de demanda de
http://example.org/claims/simplecustomclaim
, para un recurso denominadoDriver's License
y con el derecho PossessProperty.
// Create claim with custom claim type and primitive resource Claim c1 = new Claim ( "http://example.org/claims/simplecustomclaim", "Driver's License", Rights.PossessProperty);
' Create claim with custom claim type and primitive resource Dim c1 As New Claim("http://example.org/claims/simplecustomclaim", "Driver's License", Rights.PossessProperty)
Para crear una demanda personalizada basada en un tipo de datos no primitivo
Cree una demanda personalizada pasando el tipo de demanda, valor de recurso y derecho al constructor Claim(String, Object, String).
Seleccione un valor único para el tipo de demanda.
El tipo de demanda es un identificador de cadena único. Es la responsabilidad del diseñador de la demanda personalizada asegurar que el identificador de cadena que se usa para el tipo de demanda sea único. Para ver una lista de tipos de notificación definidos por WCF, consulte la clase ClaimTypes.
Elija o defina un tipo no primitivo serializable para el recurso.
Un recurso es un objeto. El tipo CLR del recurso debe ser serializable, porque WCF serializa las notificaciones en varios puntos. Los tipos primitivos ya son serializables.
Cuando se define un nuevo tipo, aplique DataContractAttribute a la clase. Aplique también el atributo DataMemberAttribute a todos los miembros del nuevo tipo que necesiten ser serializados como parte de la demanda.
El ejemplo de código siguiente define un tipo de recurso personalizado denominado
MyResourceType
.[DataContract(Name="MyResource", Namespace="http://example.org/resources")] public sealed class MyResourceType { // private members private string text; private int number; // Constructors public MyResourceType() { } public MyResourceType(string text, int number ) { this.text = text; this.number = number; } // Public properties [DataMember] public string Text { get { return this.text; } set { this.text = value; } } [DataMember] public int Number { get { return this.number; } set { this.number = value; } } }
<DataContract(Name:="MyResource", [Namespace]:="http://example.org/resources")> _ NotInheritable Public Class MyResourceType ' private members Private text_value As String Private number_value As Integer ' Constructors Public Sub New() End Sub Public Sub New(ByVal text As String, ByVal number As Integer) Me.text_value = text Me.number = number End Sub ' Public properties <DataMember()> _ Public Property Text() As String Get Return Me.text_value End Get Set Me.text_value = value End Set End Property <DataMember()> _ Public Property Number() As Integer Get Return Me.number_value End Get Set Me.number_value = value End Set End Property End Class
Elija un derecho definido por WCF o un valor único para un derecho personalizado.
Un derecho es un identificador de cadena único. Los derechos definidos por WCF se definen en la clase Rights.
Es la responsabilidad del diseñador de la demanda personalizada asegurar que el identificador de cadena que se usa para el derecho sea único.
El ejemplo de código siguiente crea una demanda personalizada con un tipo de demanda de
http://example.org/claims/complexcustomclaim
, un tipo de recurso personalizado deMyResourceType
y con el derecho PossessProperty.// Create claim with custom claim type and structured resource type Claim c2 = new Claim ( "http://example.org/claims/complexcustomclaim", new MyResourceType ( "Martin", 38 ), Rights.PossessProperty);
' Create claim with custom claim type and structured resource type Dim c2 As New Claim("http://example.org/claims/complexcustomclaim", New MyResourceType("Martin", 38), Rights.PossessProperty)
Ejemplo
El ejemplo de código siguiente muestra cómo crear una demanda personalizada con un tipo de recurso primitivo y una demanda personalizada con un tipo de recurso no primitivo.
using System;
using System.IdentityModel.Claims;
using System.Runtime.Serialization;
namespace Samples
{
[DataContract(Name="MyResource", Namespace="http://example.org/resources")]
public sealed class MyResourceType
{
// private members
private string text;
private int number;
// Constructors
public MyResourceType()
{
}
public MyResourceType(string text, int number )
{
this.text = text;
this.number = number;
}
// Public properties
[DataMember]
public string Text { get { return this.text; } set { this.text = value; } }
[DataMember]
public int Number { get { return this.number; } set { this.number = value; } }
}
class Program
{
public static void Main()
{
// Create claim with custom claim type and primitive resource
Claim c1 = new Claim ( "http://example.org/claims/simplecustomclaim", "Driver's License", Rights.PossessProperty);
// Create claim with custom claim type and structured resource type
Claim c2 = new Claim ( "http://example.org/claims/complexcustomclaim", new MyResourceType ( "Martin", 38 ), Rights.PossessProperty);
// Do something with claims
}
}
}
Imports System.IdentityModel.Claims
Imports System.Runtime.Serialization
Imports System.Security.Permissions
<DataContract(Name:="MyResource", [Namespace]:="http://example.org/resources")> _
NotInheritable Public Class MyResourceType
' private members
Private text_value As String
Private number_value As Integer
' Constructors
Public Sub New()
End Sub
Public Sub New(ByVal text As String, ByVal number As Integer)
Me.text_value = text
Me.number = number
End Sub
' Public properties
<DataMember()> _
Public Property Text() As String
Get
Return Me.text_value
End Get
Set
Me.text_value = value
End Set
End Property
<DataMember()> _
Public Property Number() As Integer
Get
Return Me.number_value
End Get
Set
Me.number_value = value
End Set
End Property
End Class
Class Program
Public Shared Sub Main()
' Create claim with custom claim type and primitive resource
Dim c1 As New Claim("http://example.org/claims/simplecustomclaim", "Driver's License", Rights.PossessProperty)
' Create claim with custom claim type and structured resource type
Dim c2 As New Claim("http://example.org/claims/complexcustomclaim", New MyResourceType("Martin", 38), Rights.PossessProperty)
End Sub
End Class
' Do something with claims