Partilhar via


Como: Criar uma declaração personalizada

A infraestrutura do Modelo de Identidade no Windows Communication Foundation (WCF) fornece um conjunto de tipos de declaração e direitos internos com as funções auxiliares para criar Claim instâncias com esses tipos e direitos. Essas declarações internas são projetadas para modelar informações encontradas em tipos de credenciais de cliente que o WCF oferece suporte por padrão. Em muitos casos, as reivindicações incorporadas são suficientes; no entanto, alguns aplicativos podem exigir declarações personalizadas. Uma reivindicação consiste no tipo de reivindicação, o recurso ao qual a reivindicação se aplica e o direito que é reivindicado sobre esse recurso. Este tópico descreve como criar uma declaração personalizada.

Para criar uma declaração personalizada baseada em um tipo de dados primitivo

  1. Crie uma declaração personalizada passando o tipo de declaração, o valor do recurso e o direito para o Claim(String, Object, String) construtor.

    1. Decida um valor exclusivo para o tipo de declaração.

      O tipo de declaração é um identificador de cadeia de caracteres exclusivo. É responsabilidade do designer de declarações personalizadas garantir que o identificador de cadeia de caracteres usado para o tipo de declaração seja exclusivo. Para obter uma lista de tipos de declaração definidos pelo WCF, consulte a ClaimTypes classe.

    2. Escolha o tipo de dados primitivo e o valor para o recurso.

      Um recurso é um objeto. O tipo CLR do recurso pode ser um primitivo, como String ou Int32, ou qualquer tipo serializável. O tipo CLR do recurso deve ser serializável, porque as declarações são serializadas em vários pontos pelo WCF. Os tipos primitivos são serializáveis.

    3. Escolha um direito definido pelo WCF ou um valor exclusivo para um direito personalizado.

      Um direito é um identificador de cadeia de caracteres exclusivo. Os direitos definidos pelo WCF são definidos na Rights classe.

      É responsabilidade do designer de declarações personalizadas garantir que o identificador de cadeia de caracteres usado para o direito seja exclusivo.

      O exemplo de código a seguir cria uma declaração personalizada com um tipo de declaração de http://example.org/claims/simplecustomclaim, para um recurso chamado Driver's License, e com a PossessProperty direita.

    // 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 criar uma declaração personalizada baseada em um tipo de dados não primitivo

  1. Crie uma declaração personalizada passando o tipo de declaração, o valor do recurso e o direito para o Claim(String, Object, String) construtor.

    1. Decida um valor exclusivo para o tipo de declaração.

      O tipo de declaração é um identificador de cadeia de caracteres exclusivo. É responsabilidade do designer de declarações personalizadas garantir que o identificador de cadeia de caracteres usado para o tipo de declaração seja exclusivo. Para obter uma lista de tipos de declaração definidos pelo WCF, consulte a ClaimTypes classe.

    2. Escolha ou defina um tipo não primitivo serializável para o recurso.

      Um recurso é um objeto. O tipo CLR do recurso deve ser serializável, porque as declarações são serializadas em vários pontos pelo WCF. Os tipos primitivos já são serializáveis.

      Quando um novo tipo é definido, aplique o DataContractAttribute à classe. Aplique também o DataMemberAttribute atributo a todos os membros do novo tipo que precisam ser serializados como parte da declaração.

      O exemplo de código a seguir define um tipo de recurso personalizado chamado 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. Escolha um direito definido pelo WCF ou um valor exclusivo para um direito personalizado.

      Um direito é um identificador de cadeia de caracteres exclusivo. Os direitos definidos pelo WCF são definidos na Rights classe.

      É responsabilidade do designer de declarações personalizadas garantir que o identificador de cadeia de caracteres usado para o direito seja exclusivo.

      O exemplo de código a seguir cria uma declaração personalizada com um tipo de declaração de http://example.org/claims/complexcustomclaim, um tipo de recurso personalizado de MyResourceType, e com a PossessProperty direita.

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

Exemplo

O exemplo de código a seguir demonstra como criar uma declaração personalizada com um tipo de recurso primitivo e uma declaração personalizada com um tipo de recurso não 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

Consulte também