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