Vorgehensweise: Erstellen eines benutzerdefinierten Anspruchs

Die identitätsmodellinfrastruktur in Windows Communication Foundation (WCF) bietet eine Reihe von integrierten Anspruchstypen und-Rechte mit den Hilfsfunktionen zum Erstellen von Claim Instanzen mit diesen Typen und rechten. Diese integrierten Ansprüche sind so konzipiert, dass sie Informationen modellieren, die sich in von WCF standardmäßig unterstützten Clientanmeldeinformationstypen befinden. In vielen Fällen sind die integrierten Ansprüche ausreichend; für einige Anwendungen sind jedoch unter Umständen benutzerdefinierte Ansprüche erforderlich. Ein Anspruch besteht aus dem Anspruchstyp, der Ressource, für die der Anspruch gilt, und dem Recht, das über diese Ressource gewährt wird. In diesem Thema wird beschrieben, wie Sie einen benutzerdefinierten Anspruch erstellen.

So erstellen Sie einen benutzerdefinierten Anspruch, der auf einem primitiven Datentyp basiert

  1. Erstellen eines benutzerdefinierten Anspruchs durch Übergeben der Anspruchstyp, Ressourcenwert und rechts, um die Claim(String, Object, String) Konstruktor.

    1. Legen Sie einen eindeutigen Wert für den Anspruchstyp fest.

      Der Anspruchstyp ist ein eindeutiger Zeichenfolgenbezeichner. Der Ersteller des benutzerdefinierten Anspruchs ist dafür verantwortlich, dass der für den Anspruchstyp verwendete Zeichenfolgenbezeichner eindeutig ist. Eine Liste der Anspruchstypen, die durch definiert sind WCF, finden Sie unter der ClaimTypes Klasse.

    2. Wählen Sie den primitiven Datentyp und den Wert für die Ressource aus.

      Eine Ressource ist ein Objekt. Der CLR-Typ der Ressource kann Primitiv sein, wie z. B. String oder Int32, oder einen beliebigen serialisierbaren Typ. Der CLR-Typ der Ressource muss serialisierbar sein, da Ansprüche von WCF an verschiedenen Punkten serialisiert werden. Primitive Typen sind serialisierbar.

    3. Wählen Sie ein von WCF definiertes Recht oder einen eindeutigen Wert für ein benutzerdefiniertes Recht aus.

      Ein Recht ist ein eindeutiger Zeichenfolgenbezeichner. Die Rechte, die durch definiert sind WCF werden gemäß der Rights Klasse.

      Der Ersteller des benutzerdefinierten Anspruchs ist dafür verantwortlich, dass der für das Recht verwendete Zeichenfolgenbezeichner eindeutig ist.

      Das folgende Codebeispiel erstellt einen benutzerdefinierten Anspruch mit einem Anspruchstyp http://example.org/claims/simplecustomclaim, für eine Ressource mit dem Namen Driver's License, und klicken Sie mit der PossessProperty rechts.

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

So erstellen Sie einen benutzerdefinierten Anspruch, der auf einem nicht primitiven Datentyp basiert

  1. Erstellen eines benutzerdefinierten Anspruchs durch Übergeben der Anspruchstyp, Ressourcenwert und rechts, um die Claim(String, Object, String) Konstruktor.

    1. Legen Sie einen eindeutigen Wert für den Anspruchstyp fest.

      Der Anspruchstyp ist ein eindeutiger Zeichenfolgenbezeichner. Der Ersteller des benutzerdefinierten Anspruchs ist dafür verantwortlich, dass der für den Anspruchstyp verwendete Zeichenfolgenbezeichner eindeutig ist. Eine Liste der Anspruchstypen, die durch definiert sind WCF, finden Sie unter der ClaimTypes Klasse.

    2. Wählen oder definieren Sie einen serialisierbaren nicht primitiven Typ für die Ressource.

      Eine Ressource ist ein Objekt. Der CLR-Typ der Ressource muss serialisierbar sein, da Ansprüche von WCF an verschiedenen Punkten serialisiert werden. Primitive Typen sind bereits serialisierbar.

      Wenn ein neuer Typ definiert ist, gelten die DataContractAttribute der-Klasse. Auch die DataMemberAttribute -Attribut auf alle Member des neuen Typs, die als Teil des Anspruchs serialisiert werden müssen.

      Im folgenden Codebeispiel wird ein benutzerdefinierter Ressourcetyp mit der Bezeichnung MyResourceType definiert.

       [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. Wählen Sie ein von WCF definiertes Recht oder einen eindeutigen Wert für ein benutzerdefiniertes Recht aus.

      Ein Recht ist ein eindeutiger Zeichenfolgenbezeichner. Die Rechte, die durch definiert sind WCF werden gemäß der Rights Klasse.

      Der Ersteller des benutzerdefinierten Anspruchs ist dafür verantwortlich, dass der für das Recht verwendete Zeichenfolgenbezeichner eindeutig ist.

      Das folgende Codebeispiel erstellt einen benutzerdefinierten Anspruch mit einem Anspruchstyp http://example.org/claims/complexcustomclaim, einem benutzerdefinierten Ressourcentyp MyResourceType, und mit der PossessProperty rechten.

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

Beispiel

Das folgende Codebeispiel veranschaulicht, wie ein benutzerdefinierter Anspruch mit einem primitiven Ressourcentyp und ein benutzerdefinierter Anspruch mit einem nicht primitiven Ressourcentyp erstellt wird.

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
	}
  }
}
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 Property
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)
    End Sub 'Main
End Class 'Program
' Do something with claims

Siehe auch

Claim
Rights
ClaimTypes
DataContractAttribute
DataMemberAttribute
Verwalten von Ansprüchen und Autorisierung mit dem Identitätsmodell
Verwalten von Ansprüchen und Autorisierung mit dem Identitätsmodell