방법: 사용자 지정 클레임 만들기
WCF(Windows Communication Foundation)의 ID 모델 인프라에서는 기본 제공 클레임 형식 및 권한 집합에 해당 형식과 권한으로 Claim 인스턴스를 만드는 도우미 기능을 제공합니다. 이러한 기본 제공 클레임은 WCF에서 기본적으로 지원하는 클라이언트 자격 증명 형식에 있는 정보를 모델링합니다. 일반적으로 기본 제공 클레임으로 충분하지만 일부 애플리케이션에는 사용자 지정 클레임이 필요할 수 있습니다. 클레임은 클레임 형식, 클레임이 적용되는 리소스 및 해당 리소스에 대해 어설션되는 권한으로 구성됩니다. 이 항목에서는 사용자 지정 클레임을 만드는 방법에 대해 설명합니다.
기본 데이터 형식을 기반으로 사용자 지정 클레임을 만들려면
클레임 형식, 리소스 값 및 권한을 Claim(String, Object, String) 생성자에 전달하여 사용자 지정 클레임을 만듭니다.
클레임 형식의 고유 값을 결정합니다.
클레임 형식은 고유한 문자열 식별자입니다. 클레임 형식에 사용되는 문자열 식별자를 고유하게 설정하는 작업은 사용자 지정 클레임 디자이너가 담당합니다. WCF에서 정의되는 클레임 형식 목록은 ClaimTypes 클래스를 참조하세요.
기본 데이터 형식과 리소스 값을 선택합니다.
리소스는 개체입니다. 리소스의 CLR 형식은 기본(예: String 또는 Int32)이나 serialize할 수 있는 모든 형식일 수 있습니다. WCF가 다양한 지점에서 클레임을 serialize하므로 리소스의 CLR 형식을 serialize할 수 있어야 합니다. 기본 형식은 serialize할 수 있습니다.
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 클래스를 참조하세요.
serialize할 수 있는 기본이 아닌 리소스 형식을 선택하거나 정의합니다.
리소스는 개체입니다. WCF가 다양한 지점에서 클레임을 serialize하므로 리소스의 CLR 형식을 serialize할 수 있어야 합니다. 기본 형식은 이미 serialize할 수 있습니다.
새 형식을 정의하는 경우 DataContractAttribute를 클래스에 적용합니다. 또한 클레임의 일부로 serialize할 수 있어야 하는 새 형식의 모든 멤버에 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