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
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.
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.
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.
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 chamadoDriver'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
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.
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.
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
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 deMyResourceType
, 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