Поделиться через


Как создать пользовательское утверждение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример

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

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
    }
  }
}

См. также

Справочник

Claim
Rights
ClaimTypes
DataContractAttribute
DataMemberAttribute

Основные понятия

Управление утверждениями и авторизацией с помощью модели удостоверения
Управление утверждениями и авторизацией с помощью модели удостоверения