Практическое руководство. Создание пользовательского утверждения

Инфраструктура модели удостоверений в Windows Communication Foundation (WCF) предоставляет набор встроенных типов утверждений и прав с вспомогательными функциями для создания Claim экземпляров с этими типами и правами. Эти встроенные утверждения предназначены для моделирования сведений, найденных в типах учетных данных клиента, поддерживаемых WCF по умолчанию. Очень часто бывает достаточно встроенных утверждений; однако некоторые приложения требуют пользовательских утверждений. Утверждение состоит из типа утверждения, ресурса, к которому применяется утверждение, и права, подтверждающегося через этот ресурс. В этом разделе описывается создание пользовательского утверждения.

Создание пользовательского утверждения на основе примитивного типа данных

  1. Создайте пользовательское утверждение, передав тип утверждения, значение ресурса и право конструктору Claim(String, Object, String).

    1. Выберите уникальное значение для типа утверждения.

      Тип утверждения - это уникальный идентификатор строки. На конструктор пользовательского утверждения возлагается обязанность убедиться в уникальности идентификатора строки, используемого для данного типа утверждения. Список типов утверждений, определенных WCF, см. в ClaimTypes классе.

    2. Выберите примитивный тип данных и значение для ресурса.

      Ресурс - это объект. Тип среды CLR ресурса может быть примитивом, например String или Int32, или любым сериализуемым типом. Тип СРЕДЫ CLR ресурса должен быть сериализуемым, так как утверждения сериализуются в различных точках WCF. Примитивные типы являются сериализуемыми.

    3. Выберите право, определенное WCF или уникальным значением для пользовательского права.

      Право - это уникальный идентификатор строки. Права, определенные WCF, определяются в Rights классе.

      На конструктор пользовательского утверждения возлагается обязанность убедиться в уникальности идентификатора строки, используемого для данного права.

      В следующем примере кода показано создание пользовательского утверждения с типом утверждения http://example.org/claims/simplecustomclaim для ресурса с именем Driver's License и правом PossessProperty.

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

Создание пользовательского утверждения на основе непримитивного типа данных

  1. Создайте пользовательское утверждение, передав тип утверждения, значение ресурса и право конструктору Claim(String, Object, String).

    1. Выберите уникальное значение для типа утверждения.

      Тип утверждения - это уникальный идентификатор строки. На конструктор пользовательского утверждения возлагается обязанность убедиться в уникальности идентификатора строки, используемого для данного типа утверждения. Список типов утверждений, определенных WCF, см. в ClaimTypes классе.

    2. Выберите или определите сериализуемый непримитивный тип для ресурса.

      Ресурс - это объект. Тип СРЕДЫ CLR ресурса должен быть сериализуемым, так как утверждения сериализуются в различных точках WCF. Примитивные типы уже являются сериализуемыми.

      При определении нового типа примените к классу атрибут DataContractAttribute. Также примените атрибут DataMemberAttribute ко всем членам нового типа, которые необходимо сериализовать как часть утверждения.

      В следующем примере кода определяется пользовательский тип ресурса с именем 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. Выберите право, определенное WCF или уникальным значением для пользовательского права.

      Право - это уникальный идентификатор строки. Права, определенные WCF, определяются в Rights классе.

      На конструктор пользовательского утверждения возлагается обязанность убедиться в уникальности идентификатора строки, используемого для данного права.

      В следующем примере кода показано создание пользовательского утверждения с типом утверждения http://example.org/claims/complexcustomclaim, пользовательским типом ресурса MyResourceType и правом 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);
      
      ' 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)
      

Пример

В следующем примере кода демонстрируется создание пользовательского утверждения с примитивным типом ресурса и пользовательского утверждения с непримитивным типом ресурса.

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

См. также