Comment : créer une revendication personnalisée

L'infrastructure de modèle d'identité dans Windows Communication Foundation (WCF) fournit un ensemble de types et droits de revendication intégrés avec des fonctions d'assistance pour créer des instances Claim avec ces types et droits. Ces revendications intégrées sont conçues pour modeler données trouvées dans les types d'informations d'identification du client que WCF prend en charge par défaut. Dans la plupart des cas, les revendications intégrées sont suffisantes ; toutefois, certaines applications peuvent requérir des revendications personnalisées. Une revendication comporte trois volets : le type de revendication, la ressource à laquelle la revendication s'applique et le droit revendiqué sur cette ressource. Cette rubrique décrit comment créer une revendication personnalisée.

Pour créer une revendication personnalisée basée sur un type de données primitif

  1. Créez une revendication personnalisée en passant le type de revendication, la valeur de la ressource et le droit sur la ressource au constructeur Claim.

    1. Choisissez une valeur unique pour le type de revendication.

      Le type de revendication est un identificateur de chaîne unique. Il incombe au concepteur de la revendication personnalisée de vérifier que l'identificateur de chaîne utilisé pour le type de revendication est unique. Pour obtenir une liste des types de revendications définis par WCF, consultez la classe ClaimTypes.

    2. Choisissez le type de données primitif et la valeur de la ressource.

      Une ressource est un objet. Le type CLR de la ressource peut être une primitive, telle que String ou Int32, ou tout type sérialisable. Le type CLR de la ressource doit être sérialisable, car les revendications sont sérialisées en différents points par WCF. Les types primitifs sont sérialisables.

    3. Choisissez un droit défini par WCF ou une valeur unique pour un droit personnalisé.

      Un droit est un identificateur de chaîne unique. Les droits définis par WCF le sont dans la classe Rights.

      Il incombe au concepteur de la revendication personnalisée de vérifier que l'identificateur de chaîne utilisé pour le droit est unique.

      L'exemple de code suivant crée une revendication personnalisée avec un type de revendication http://example.org/claims/simplecustomclaim, pour une ressource nommée Driver's License, et avec le droit 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)
    
    // Create claim with custom claim type and primitive resource
    Claim c1 = new Claim ( "http://example.org/claims/simplecustomclaim", "Driver's License", Rights.PossessProperty);
    

Pour créer une revendication personnalisée basée sur un type de données non primitif

  1. Créez une revendication personnalisée en passant le type de revendication, la valeur de la ressource et le droit sur la ressource au constructeur Claim.

    1. Choisissez une valeur unique pour le type de revendication.

      Le type de revendication est un identificateur de chaîne unique. Il incombe au concepteur de la revendication personnalisée de vérifier que l'identificateur de chaîne utilisé pour le type de revendication est unique. Pour obtenir une liste des types de revendications définis par WCF, consultez la classe ClaimTypes.

    2. Choisissez ou définissez un type non primitif sérialisable pour la ressource.

      Une ressource est un objet. Le type CLR de la ressource doit être sérialisable, car les revendications sont sérialisées en différents points par WCF. Les types primitifs sont déjà sérialisables.

      Lorsqu'un nouveau type est défini, appliquez DataContractAttribute à la classe. Appliquez également l'attribut DataMemberAttribute à tous les membres du nouveau type qui doivent être sérialisés dans le cadre de la revendication.

      L'exemple de code suivant définit un type de ressource personnalisé nommé MyResourceType.

      <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 'New
      
      
          Public Sub New(ByVal text As String, ByVal number As Integer) 
              Me.text_value = text
              Me.number = number
      
          End Sub 'New
      
          ' 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
      
      [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; } }
      }  
      
    3. Choisissez un droit défini par WCF ou une valeur unique pour un droit personnalisé.

      Un droit est un identificateur de chaîne unique. Les droits définis par WCF le sont dans la classe Rights.

      Il incombe au concepteur de la revendication personnalisée de vérifier que l'identificateur de chaîne utilisé pour le droit est unique.

      L'exemple de code suivant crée une revendication personnalisée avec un type de revendication http://example.org/claims/complexcustomclaim, un type de ressource personnalisé MyResourceType et avec le droit 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)
    
    
    // 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);
    

Exemple

L'exemple de code suivant montre comment créer une revendication personnalisée avec un type de ressource primitif et un type de ressource non primitif.

Imports System
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 'New
    
    
    Public Sub New(ByVal text As String, ByVal number As Integer) 
        Me.text_value = text
        Me.number = number
    
    End Sub 'New
    
    ' 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 Class 'MyResourceType

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)
    
' Do something with claims
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
    }
  }
}

Voir aussi

Référence

Claim
Rights
ClaimTypes
DataContractAttribute
DataMemberAttribute

Concepts

Gestion des revendications et autorisation avec le modèle d'identité
Gestion des revendications et autorisation avec le modèle d'identité