Instrukcje: Tworzenie oświadczenia niestandardowego

Infrastruktura modelu tożsamości w programie Windows Communication Foundation (WCF) udostępnia zestaw wbudowanych typów oświadczeń i praw z funkcjami pomocnika do tworzenia Claim wystąpień z tymi typami i prawami. Te wbudowane oświadczenia są przeznaczone do modelowania informacji znalezionych w typach poświadczeń klienta, które domyślnie obsługuje program WCF. W wielu przypadkach wbudowane oświadczenia są wystarczające; jednak niektóre aplikacje mogą wymagać oświadczeń niestandardowych. Oświadczenie składa się z typu oświadczenia, zasobu, dla którego ma zastosowanie oświadczenie i prawa, które jest potwierdzane przez ten zasób. W tym temacie opisano sposób tworzenia oświadczenia niestandardowego.

Aby utworzyć oświadczenie niestandardowe oparte na typie danych pierwotnych

  1. Utwórz oświadczenie niestandardowe, przekazując typ oświadczenia, wartość zasobu i prawo do konstruktora Claim(String, Object, String) .

    1. Zdecyduj o unikatowej wartości dla typu oświadczenia.

      Typ oświadczenia jest unikatowym identyfikatorem ciągu. Jest to odpowiedzialność niestandardowego projektanta oświadczeń, aby upewnić się, że identyfikator ciągu używany dla typu oświadczenia jest unikatowy. Aby uzyskać listę typów oświadczeń zdefiniowanych przez usługę WCF, zobacz klasę ClaimTypes .

    2. Wybierz typ danych pierwotnych i wartość zasobu.

      Zasób jest obiektem. Typ CLR zasobu może być pierwotny, taki jak String lub Int32, lub dowolny typ z możliwością serializacji. Typ CLR zasobu musi być serializowany, ponieważ oświadczenia są serializowane w różnych punktach przez usługę WCF. Typy pierwotne można serializować.

    3. Wybierz prawo zdefiniowane przez usługę WCF lub unikatową wartość prawa niestandardowego.

      Prawo jest unikatowym identyfikatorem ciągu. Prawa zdefiniowane przez usługę Rights WCF są definiowane w klasie .

      Jest to odpowiedzialność niestandardowego projektanta oświadczeń, aby upewnić się, że identyfikator ciągu używany dla prawa jest unikatowy.

      Poniższy przykład kodu tworzy oświadczenie niestandardowe z typem http://example.org/claims/simplecustomclaimoświadczenia , dla zasobu o nazwie Driver's Licensei z PossessProperty prawej strony.

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

Aby utworzyć oświadczenie niestandardowe oparte na typie danych innych niż pierwotny

  1. Utwórz oświadczenie niestandardowe, przekazując typ oświadczenia, wartość zasobu i prawo do konstruktora Claim(String, Object, String) .

    1. Zdecyduj o unikatowej wartości dla typu oświadczenia.

      Typ oświadczenia jest unikatowym identyfikatorem ciągu. Jest to odpowiedzialność niestandardowego projektanta oświadczeń, aby upewnić się, że identyfikator ciągu używany dla typu oświadczenia jest unikatowy. Aby uzyskać listę typów oświadczeń zdefiniowanych przez usługę WCF, zobacz klasę ClaimTypes .

    2. Wybierz lub zdefiniuj typ nietypowy, który można serializować dla zasobu.

      Zasób jest obiektem. Typ CLR zasobu musi być serializowany, ponieważ oświadczenia są serializowane w różnych punktach przez usługę WCF. Typy pierwotne są już serializowalne.

      Po zdefiniowaniu nowego typu zastosuj element DataContractAttribute do klasy . Zastosuj DataMemberAttribute również atrybut do wszystkich elementów członkowskich nowego typu, które muszą być serializowane w ramach oświadczenia.

      Poniższy przykład kodu definiuje niestandardowy typ zasobu o nazwie 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. Wybierz prawo zdefiniowane przez usługę WCF lub unikatową wartość prawa niestandardowego.

      Prawo jest unikatowym identyfikatorem ciągu. Prawa zdefiniowane przez usługę Rights WCF są definiowane w klasie .

      Jest to odpowiedzialność niestandardowego projektanta oświadczeń, aby upewnić się, że identyfikator ciągu używany dla prawa jest unikatowy.

      Poniższy przykład kodu tworzy oświadczenie niestandardowe z typem oświadczenia , niestandardowym typem http://example.org/claims/complexcustomclaimMyResourceTypezasobu i z PossessProperty prawej strony.

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

Przykład

W poniższym przykładzie kodu pokazano, jak utworzyć oświadczenie niestandardowe z typem zasobu pierwotnego i oświadczeniem niestandardowym z typem zasobu innego niż pierwotny.

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

Zobacz też