Procedimiento para crear una notificación personalizadaHow to: Create a Custom Claim

La infraestructura del modelo de identidad de Windows Communication Foundation (WCF) proporciona un conjunto de tipos y derechos de notificaciones integrados con las funciones auxiliares para crear Claim instancias con esos tipos y derechos.The Identity Model infrastructure in Windows Communication Foundation (WCF) provides a set of built-in claim types and rights with the helper functions for creating Claim instances with those types and rights. Estas notificaciones integradas están diseñadas para modelar la información que se encuentra en los tipos de credenciales de cliente que WCF admite de forma predeterminada.These built-in claims are designed to model information found in client credential types that WCF supports by default. En muchos casos, las demandas integradas son suficientes; sin embargo, algunas aplicaciones pueden exigir demandas personalizadas.In many cases, the built-in claims are sufficient; however some applications may require custom claims. 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.A claim consists of the claim type, the resource for which the claim applies to and the right that is asserted over that resource. En este tema se describe cómo crear una demanda personalizada.This topic describes how to create a custom claim.

Para crear una demanda personalizada que está basada en un tipo de datos primitivoTo create a custom claim that is based on a primitive data type

  1. Cree una demanda personalizada pasando el tipo de demanda, valor de recurso y derecho al constructor Claim(String, Object, String).Create a custom claim by passing the claim type, resource value and right to the Claim(String, Object, String) constructor.

    1. Seleccione un valor único para el tipo de demanda.Decide on a unique value for the claim type.

      El tipo de demanda es un identificador de cadena único.The claim type is a unique string identifier. 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.It is the custom claim designer's responsibility to ensure that the string identifier that is used for the claim type is unique. Para obtener una lista de los tipos de notificaciones definidos por WCF, vea la ClaimTypes clase.For a list of claim types that are defined by WCF, see the ClaimTypes class.

    2. Elija el tipo de datos primitivo y el valor para el recurso.Choose the primitive data type and value for the resource.

      Un recurso es un objeto.A resource is an object. El tipo CLR del recurso puede ser primitivo, como String o Int32, así como cualquier tipo serializable.The CLR type of the resource can be a primitive, such as String or Int32, or any serializable type. El tipo CLR del recurso debe ser serializable, porque las notificaciones se serializan en varios puntos por WCF.The CLR type of the resource must be serializable, because claims are serialized at various points by WCF. Los tipos primitivos son serializables.Primitive types are serializable.

    3. Elija un derecho definido por WCF o un valor único para un derecho personalizado.Choose a right that is defined by WCF or a unique value for a custom right.

      Un derecho es un identificador de cadena único.A right is a unique string identifier. Los derechos definidos por WCF se definen en la Rights clase.The rights that are defined by WCF are defined in the Rights class.

      Es la responsabilidad del diseñador de la demanda personalizada asegurar que el identificador de cadena que se usa para el derecho sea único.It is the custom claim designer's responsibility to ensure that the string identifier that is used for the right is unique.

      El ejemplo de código siguiente crea una demanda personalizada con un tipo de demanda de http://example.org/claims/simplecustomclaim, para un recurso denominado Driver's License y con el derecho PossessProperty.The following code example creates a custom claim with a claim type of http://example.org/claims/simplecustomclaim, for a resource named Driver's License, and with the PossessProperty right.

    // 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 primitivoTo create a custom claim that is based on a non-primitive data type

  1. Cree una demanda personalizada pasando el tipo de demanda, valor de recurso y derecho al constructor Claim(String, Object, String).Create a custom claim by passing the claim type, resource value and right to the Claim(String, Object, String) constructor.

    1. Seleccione un valor único para el tipo de demanda.Decide on a unique value for the claim type.

      El tipo de demanda es un identificador de cadena único.The claim type is a unique string identifier. 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.It is the custom claim designer's responsibility to ensure that the string identifier that is used for the claim type is unique. Para obtener una lista de los tipos de notificaciones definidos por WCF, vea la ClaimTypes clase.For a list of claim types that are defined by WCF, see the ClaimTypes class.

    2. Elija o defina un tipo no primitivo serializable para el recurso.Choose or define a serializable non-primitive type for the resource.

      Un recurso es un objeto.A resource is an object. El tipo CLR del recurso debe ser serializable, porque las notificaciones se serializan en varios puntos por WCF.The CLR type of the resource must be serializable, because claims are serialized at various points by WCF. Los tipos primitivos ya son serializables.Primitive types are already serializable.

      Cuando se define un nuevo tipo, aplique DataContractAttribute a la clase.When a new type is defined, apply the DataContractAttribute to the class. Aplique también el atributo DataMemberAttribute a todos los miembros del nuevo tipo que necesiten ser serializados como parte de la demanda.Also apply the DataMemberAttribute attribute to the all members of the new type that need to be serialized as part of the claim.

      El ejemplo de código siguiente define un tipo de recurso personalizado denominado MyResourceType.The following code example defines a custom resource type named 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
      
    3. Elija un derecho definido por WCF o un valor único para un derecho personalizado.Choose a right that is defined by WCF or a unique value for a custom right.

      Un derecho es un identificador de cadena único.A right is a unique string identifier. Los derechos definidos por WCF se definen en la Rights clase.The rights that are defined by WCF are defined in the Rights class.

      Es la responsabilidad del diseñador de la demanda personalizada asegurar que el identificador de cadena que se usa para el derecho sea único.It is the custom claim designer's responsibility to ensure that the string identifier that is used for the right is unique.

      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 de MyResourceType y con el derecho PossessProperty.The following code example creates a custom claim with a claim type of http://example.org/claims/complexcustomclaim, a custom resource type of MyResourceType, and with the PossessProperty right.

      // 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)
      

EjemploExample

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.The following code example demonstrates how to create a custom claim with a primitive resource type and a custom claim with a non-primitive resource type.

using System;
using System.IdentityModel.Claims;
using System.Runtime.Serialization;
using System.Security.Permissions;
[assembly: SecurityPermission(
   SecurityAction.RequestMinimum, Execution = true)]
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


<assembly: SecurityPermission(SecurityAction.RequestMinimum, Execution:=True)>

<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

Vea tambiénSee also