Практическое руководство. Создание пользовательского утверждения
Инфраструктура модели удостоверений в Windows Communication Foundation (WCF) предоставляет набор встроенных типов утверждений и прав с вспомогательными функциями для создания Claim экземпляров с этими типами и правами. Эти встроенные утверждения предназначены для моделирования сведений, найденных в типах учетных данных клиента, поддерживаемых WCF по умолчанию. Очень часто бывает достаточно встроенных утверждений; однако некоторые приложения требуют пользовательских утверждений. Утверждение состоит из типа утверждения, ресурса, к которому применяется утверждение, и права, подтверждающегося через этот ресурс. В этом разделе описывается создание пользовательского утверждения.
Создание пользовательского утверждения на основе примитивного типа данных
Создайте пользовательское утверждение, передав тип утверждения, значение ресурса и право конструктору Claim(String, Object, String).
Выберите уникальное значение для типа утверждения.
Тип утверждения - это уникальный идентификатор строки. На конструктор пользовательского утверждения возлагается обязанность убедиться в уникальности идентификатора строки, используемого для данного типа утверждения. Список типов утверждений, определенных WCF, см. в ClaimTypes классе.
Выберите примитивный тип данных и значение для ресурса.
Ресурс - это объект. Тип среды CLR ресурса может быть примитивом, например String или Int32, или любым сериализуемым типом. Тип СРЕДЫ CLR ресурса должен быть сериализуемым, так как утверждения сериализуются в различных точках WCF. Примитивные типы являются сериализуемыми.
Выберите право, определенное 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)
Создание пользовательского утверждения на основе непримитивного типа данных
Создайте пользовательское утверждение, передав тип утверждения, значение ресурса и право конструктору Claim(String, Object, String).
Выберите уникальное значение для типа утверждения.
Тип утверждения - это уникальный идентификатор строки. На конструктор пользовательского утверждения возлагается обязанность убедиться в уникальности идентификатора строки, используемого для данного типа утверждения. Список типов утверждений, определенных WCF, см. в ClaimTypes классе.
Выберите или определите сериализуемый непримитивный тип для ресурса.
Ресурс - это объект. Тип СРЕДЫ 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
Выберите право, определенное 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