CodeAccessPermission 클래스
모든 코드 액세스 권한의 내부 구조를 정의합니다.
네임스페이스: System.Security
어셈블리: mscorlib(mscorlib.dll)
구문
‘선언
<SerializableAttribute> _
<ComVisibleAttribute(True)> _
Public MustInherit Class CodeAccessPermission
Implements IPermission, ISecurityEncodable, IStackWalk
‘사용 방법
Dim instance As CodeAccessPermission
[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class CodeAccessPermission : IPermission, ISecurityEncodable, IStackWalk
[SerializableAttribute]
[ComVisibleAttribute(true)]
public ref class CodeAccessPermission abstract : IPermission, ISecurityEncodable, IStackWalk
/** @attribute SerializableAttribute() */
/** @attribute ComVisibleAttribute(true) */
public abstract class CodeAccessPermission implements IPermission, ISecurityEncodable,
IStackWalk
SerializableAttribute
ComVisibleAttribute(true)
public abstract class CodeAccessPermission implements IPermission, ISecurityEncodable,
IStackWalk
설명
코드 액세스 권한에서는 스택 워크를 사용하여 코드의 모든 호출자가 권한이 있는지 확인합니다. 권한 개체가 Null 참조(Visual Basic의 경우 Nothing)인 경우 PermissionState.None 상태의 권한 개체와 동일하게 처리됩니다.
호출 스택은 일반적으로 하향식으로 표현되므로 호출 스택의 상위 메서드가 호출 스택의 하위 메서드를 호출합니다.
CodeAccessPermission 클래스의 상속자는 보안 인프라를 확장하는 사용 권한으로 올바르게 작동할 수 있도록 완전 신뢰를 부여받야야 합니다. CodeAccessPermission은 상속자에 완전 신뢰가 부여된 것을 확인하기 위해 ControlEvidence = true 및 ControlPolicy = true에 대한 InheritanceDemand를 발생시킵니다.
상속 요청에 대한 자세한 내용은 상속 요청을 참조하십시오.
상속자 참고 사항 CodeAccessPermission에서 상속할 때 IUnrestrictedPermission 인터페이스도 구현해야 합니다. CodeAccessPermission 멤버인 Copy, Intersect, IsSubsetOf, ToXml, FromXml 및 Union을 재정의해야 합니다. 또한 유일한 매개 변수로 PermissionState를 받아들이는 생성자를 정의해야 합니다. CodeAccessPermission에서 상속되는 클래스에 SerializableAttribute 특성을 적용해야 합니다.
예제
다음 코드 예제에서는 CodeAccessPermission 클래스에서 파생된 사용 권한을 보여 줍니다.
' This custom permission is intended only for the purposes of illustration.
' The following code shows how to create a custom permission that inherits
' from CodeAccessPermission. The code implements all required overrides.
' A wildcard character ('*') is implemented for the Name property.
Imports System
Imports System.Security
Imports System.Security.Permissions
Imports System.IO
Imports System.Security.Policy
Imports System.Collections
Imports Microsoft.VisualBasic
<assembly: System.Reflection.AssemblyKeyFile("Key.snk")>
<assembly: System.Security.AllowPartiallyTrustedCallersAttribute()>
Namespace MyPermission
<Serializable()> _
Public NotInheritable Class NameIdPermission
Inherits CodeAccessPermission
Implements IUnrestrictedPermission
Private m_Name As String
Private m_Unrestricted As Boolean
Public Sub New(ByVal name As String)
m_name = name
End Sub 'New
Public Sub New(ByVal state As PermissionState)
If state = PermissionState.None Then
m_name = ""
ElseIf state = PermissionState.Unrestricted Then
Throw New ArgumentException("Unrestricted state is not allowed for identity permissions.")
Else
Throw New ArgumentException("Invalid permission state.")
End If
End Sub 'New
Public Property Name() As String
Get
Return m_name
End Get
Set(ByVal Value As String)
m_name = Value
End Set
End Property
Public Overrides Function Copy() As IPermission
Dim name As String
name = m_name
Return New NameIdPermission(name)
End Function 'Copy
Public Function IsUnrestricted() As Boolean Implements IUnrestrictedPermission.IsUnrestricted
' Always false, unrestricted state is not allowed.
Return m_Unrestricted
End Function 'IsUnrestricted
Private Function VerifyType(ByVal target As IPermission) As Boolean
Return TypeOf target Is NameIdPermission
End Function 'VerifyType
Public Overrides Function IsSubsetOf(ByVal target As IPermission) As Boolean
#If (Debug) Then
Console.WriteLine("************* Entering IsSubsetOf *********************")
#End If
If target Is Nothing Then
Console.WriteLine("IsSubsetOf: target == null")
Return False
End If
#If (Debug) Then
Console.WriteLine(("This is = " + CType(Me, NameIdPermission).Name))
Console.WriteLine(("Target is " + CType(target, NameIdPermission).m_name))
#End If
Try
Dim operand As NameIdPermission = CType(target, NameIdPermission)
' The following check for unrestricted permission is only included as an example for
' permissions that allow the unrestricted state. It is of no value for this permission.
If True = operand.m_Unrestricted Then
Return True
ElseIf True = Me.m_Unrestricted Then
Return False
End If
If Not (Me.m_name Is Nothing) Then
If operand.m_name Is Nothing Then
Return False
End If
If Me.m_name = "" Then
Return True
End If
End If
If Me.m_name.Equals(operand.m_name) Then
Return True
Else
' Check for wild card character '*'.
Dim i As Integer = operand.m_name.LastIndexOf("*")
If i > 0 Then
Dim prefix As String = operand.m_name.Substring(0, i)
If Me.m_name.StartsWith(prefix) Then
Return True
End If
End If
End If
Return False
Catch
Throw New ArgumentException(String.Format("Argument_WrongType", Me.GetType().FullName))
End Try
End Function 'IsSubsetOf
Public Overrides Function Intersect(ByVal target As IPermission) As IPermission
Console.WriteLine("************* Entering Intersect *********************")
If target Is Nothing Then
Return Nothing
End If
#If (Debug) Then
Console.WriteLine(("This is = " + CType(Me, NameIdPermission).Name))
Console.WriteLine(("Target is " + CType(target, NameIdPermission).m_name))
#End If
If Not VerifyType(target) Then
Throw New ArgumentException(String.Format("Argument is wrong type.", Me.GetType().FullName))
End If
Dim operand As NameIdPermission = CType(target, NameIdPermission)
If operand.IsSubsetOf(Me) Then
Return operand.Copy()
ElseIf Me.IsSubsetOf(operand) Then
Return Me.Copy()
Else
Return Nothing
End If
End Function 'Intersect
Public Overrides Function Union(ByVal target As IPermission) As IPermission
#If (Debug) Then
Console.WriteLine("************* Entering Union *********************")
#End If
If target Is Nothing Then
Return Me
End If
#If (Debug) Then
Console.WriteLine(("This is = " + CType(Me, NameIdPermission).Name))
Console.WriteLine(("Target is " + CType(target, NameIdPermission).m_name))
#End If
If Not VerifyType(target) Then
Throw New ArgumentException(String.Format("Argument_WrongType", Me.GetType().FullName))
End If
Dim operand As NameIdPermission = CType(target, NameIdPermission)
If operand.IsSubsetOf(Me) Then
Return Me.Copy()
ElseIf Me.IsSubsetOf(operand) Then
Return operand.Copy()
Else
Return Nothing
End If
End Function 'Union
Public Overrides Sub FromXml(ByVal e As SecurityElement)
' The following code for unrestricted permission is only included as an example for
' permissions that allow the unrestricted state. It is of no value for this permission.
Dim elUnrestricted As String = e.Attribute("Unrestricted")
If Nothing <> elUnrestricted Then
m_Unrestricted = Boolean.Parse(elUnrestricted)
Return
End If
Dim elName As String = e.Attribute("Name")
m_name = IIf(elName Is Nothing, Nothing, elName)
End Sub 'FromXml
Public Overrides Function ToXml() As SecurityElement
' Use the SecurityElement class to encode the permission to XML.
Dim esd As New SecurityElement("IPermission")
Dim name As String = GetType(NameIdPermission).AssemblyQualifiedName
esd.AddAttribute("class", name)
esd.AddAttribute("version", "1.0")
' The following code for unrestricted permission is only included as an example for
' permissions that allow the unrestricted state. It is of no value for this permission.
If m_Unrestricted Then
esd.AddAttribute("Unrestricted", True.ToString())
End If
If Not (m_Name Is Nothing) Then
esd.AddAttribute("Name", m_Name)
End If
Return esd
End Function 'ToXml
End Namespace
//#define debug
// This custom permission is intended only for the purposes of illustration.
// The following code shows how to create a custom permission that inherits
// from CodeAccessPermission. The code implements all required overrides.
// A wildcard character ('*') is implemented for the Name property.
using System;
using System.Security;
using System.Security.Permissions;
using System.IO;
using System.Security.Policy;
using System.Collections;
using System.Text;
[assembly:System.Reflection.AssemblyKeyFile("Key.snk")]
[assembly:System.Security.AllowPartiallyTrustedCallersAttribute()]
namespace MyPermission
{
[Serializable()] sealed public class NameIdPermission : CodeAccessPermission, IUnrestrictedPermission
{
private String m_Name;
private bool m_Unrestricted;
public NameIdPermission(String name)
{
m_Name = name;
}
public NameIdPermission(PermissionState state)
{
if (state == PermissionState.None)
{
m_Name = "";
}
else
if (state == PermissionState.Unrestricted)
{
throw new ArgumentException("Unrestricted state is not allowed for identity permissions.");
}
else throw new ArgumentException("Invalid permission state.");
}
public String Name
{
set{m_Name = value;}
get{ return m_Name;}
}
public override IPermission Copy()
{
string name = m_Name;
return new NameIdPermission( name );
}
public bool IsUnrestricted()
{
// Always false, unrestricted state is not allowed.
return m_Unrestricted;
}
private bool VerifyType(IPermission target)
{
return (target is NameIdPermission);
}
public override bool IsSubsetOf(IPermission target)
{
#if(debug)
Console.WriteLine ("************* Entering IsSubsetOf *********************");
#endif
if (target == null)
{
Console.WriteLine ("IsSubsetOf: target == null");
return false;
}
#if(debug)
Console.WriteLine ("This is = " + (( NameIdPermission)this).Name);
Console.WriteLine ("Target is " + (( NameIdPermission)target).m_Name);
#endif
try
{
NameIdPermission operand = ( NameIdPermission)target;
// The following check for unrestricted permission is only included as an example for
// permissions that allow the unrestricted state. It is of no value for this permission.
if (true == operand.m_Unrestricted)
{
return true;
}
else if (true == this.m_Unrestricted)
{
return false;
}
if (this.m_Name != null)
{
if (operand.m_Name == null) return false;
if (this.m_Name == "") return true;
}
if (this.m_Name.Equals (operand.m_Name)) return true;
else
{
// Check for wild card character '*'.
int i = operand.m_Name.LastIndexOf ("*");
if (i > 0)
{
string prefix = operand.m_Name.Substring (0, i);
if (this.m_Name.StartsWith (prefix))
{
return true;
}
}
}
return false;
}
catch (InvalidCastException)
{
throw new ArgumentException (String.Format ("Argument_WrongType", this.GetType ().FullName));
}
}
public override IPermission Intersect(IPermission target)
{
Console.WriteLine ("************* Entering Intersect *********************");
if (target == null)
{
return null;
}
#if(debug)
Console.WriteLine ("This is = " + (( NameIdPermission)this).Name);
Console.WriteLine ("Target is " + (( NameIdPermission)target).m_Name);
#endif
if (!VerifyType(target))
{
throw new ArgumentException (String.Format ("Argument is wrong type.", this.GetType ().FullName));
}
NameIdPermission operand = ( NameIdPermission)target;
if (operand.IsSubsetOf (this)) return operand.Copy ();
else if (this.IsSubsetOf (operand)) return this.Copy ();
else
return null;
}
public override IPermission Union(IPermission target)
{
#if(debug)
Console.WriteLine ("************* Entering Union *********************");
#endif
if (target == null)
{
return this;
}
#if(debug)
Console.WriteLine ("This is = " + (( NameIdPermission)this).Name);
Console.WriteLine ("Target is " + (( NameIdPermission)target).m_Name);
#endif
if (!VerifyType(target))
{
throw new ArgumentException (String.Format ("Argument_WrongType", this.GetType ().FullName));
}
NameIdPermission operand = ( NameIdPermission)target;
if (operand.IsSubsetOf (this)) return this.Copy ();
else if (this.IsSubsetOf (operand)) return operand.Copy ();
else
return null;
}
public override void FromXml(SecurityElement e)
{
// The following code for unrestricted permission is only included as an example for
// permissions that allow the unrestricted state. It is of no value for this permission.
String elUnrestricted = e.Attribute("Unrestricted");
if (null != elUnrestricted)
{
m_Unrestricted = bool.Parse(elUnrestricted);
return;
}
String elName = e.Attribute( "Name" );
m_Name = elName == null ? null : elName;
}
public override SecurityElement ToXml()
{
// Use the SecurityElement class to encode the permission to XML.
SecurityElement esd = new SecurityElement("IPermission");
String name = typeof( NameIdPermission).AssemblyQualifiedName;
esd.AddAttribute("class", name);
esd.AddAttribute("version", "1.0");
// The following code for unrestricted permission is only included as an example for
// permissions that allow the unrestricted state. It is of no value for this permission.
if (m_Unrestricted)
{
esd.AddAttribute("Unrestricted", true.ToString());
}
if (m_Name != null) esd.AddAttribute( "Name", m_Name );
return esd;
}
}
}
//#define debug
// This custom permission is intended only for the purposes of illustration.
// The following code shows how to create a custom permission that inherits
// from CodeAccessPermission. The code implements all required overrides.
// A wildcard character ('*') is implemented for the Name property.
using namespace System;
using namespace System::Security;
using namespace System::Security::Permissions;
using namespace System::IO;
using namespace System::Security::Policy;
using namespace System::Collections;
using namespace System::Text;
[assembly:System::Reflection::AssemblyKeyFile("Key.snk")];
[assembly:System::Security::AllowPartiallyTrustedCallersAttribute];
[Serializable]
public ref class NameIdPermission: public CodeAccessPermission, public IUnrestrictedPermission
{
private:
String^ m_Name;
bool m_Unrestricted;
public:
NameIdPermission( String^ name )
{
m_Name = name;
}
NameIdPermission( PermissionState state )
{
if ( state == PermissionState::None )
{
m_Name = "";
}
else if ( state == PermissionState::Unrestricted )
{
throw gcnew ArgumentException( "Unrestricted state is not allowed for identity permissions." );
}
else
{
throw gcnew ArgumentException( "Invalid permission state." );
}
}
property String^ Name
{
String^ get()
{
return m_Name;
}
void set( String^ value )
{
m_Name = value;
}
}
public:
virtual IPermission^ Copy() override
{
String^ name = m_Name;
return gcnew NameIdPermission( name );
}
public:
virtual bool IsUnrestricted()
{
// Always false, unrestricted state is not allowed.
return m_Unrestricted;
}
private:
bool VerifyType( IPermission^ target )
{
return dynamic_cast<NameIdPermission^>(target) != nullptr;
}
public:
virtual bool IsSubsetOf( IPermission^ target ) override
{
#if ( debug )
Console::WriteLine( "************* Entering IsSubsetOf *********************" );
#endif
if ( target == nullptr )
{
Console::WriteLine( "IsSubsetOf: target == null" );
return false;
}
#if ( debug )
Console::WriteLine( "This is = {0}", ((NameIdPermission)this).Name );
Console::WriteLine( "Target is {0}", ((NameIdPermission)target).m_Name );
#endif
try
{
NameIdPermission^ operand = dynamic_cast<NameIdPermission^>(target);
// The following check for unrestricted permission is only included as an example for
// permissions that allow the unrestricted state. It is of no value for this permission.
if ( true == operand->m_Unrestricted )
{
return true;
}
else if ( true == this->m_Unrestricted )
{
return false;
}
if ( this->m_Name != nullptr )
{
if ( operand->m_Name == nullptr )
{
return false;
}
if ( this->m_Name->Equals( "" ) )
{
return true;
}
}
if ( this->m_Name->Equals( operand->m_Name ) )
{
return true;
}
else
{
// Check for wild card character '*'.
int i = operand->m_Name->LastIndexOf( "*" );
if ( i > 0 )
{
String^ prefix = operand->m_Name->Substring( 0, i );
if ( this->m_Name->StartsWith( prefix ) )
{
return true;
}
}
}
return false;
}
catch ( InvalidCastException^ )
{
throw gcnew ArgumentException( String::Format( "Argument_WrongType", this->GetType()->FullName ) );
}
}
public:
virtual IPermission^ Intersect( IPermission^ target ) override
{
Console::WriteLine( "************* Entering Intersect *********************" );
if ( target == nullptr )
{
return nullptr;
}
#if ( debug )
Console::WriteLine( "This is = {0}", ((NameIdPermission)this).Name );
Console::WriteLine( "Target is {0}", ((NameIdPermission)target).m_Name );
#endif
if ( !VerifyType( target ) )
{
throw gcnew ArgumentException( String::Format( "Argument is wrong type.", this->GetType()->FullName ) );
}
NameIdPermission^ operand = dynamic_cast<NameIdPermission^>(target);
if ( operand->IsSubsetOf( this ) )
{
return operand->Copy();
}
else if ( this->IsSubsetOf( operand ) )
{
return this->Copy();
}
else
{
return nullptr;
}
}
public:
virtual IPermission^ Union( IPermission^ target ) override
{
#if ( debug )
Console::WriteLine( "************* Entering Union *********************" );
#endif
if ( target == nullptr )
{
return this;
}
#if ( debug )
Console::WriteLine( "This is = {0}", ((NameIdPermission)this).Name );
Console::WriteLine( "Target is {0}", ((NameIdPermission)target).m_Name );
#endif
if ( !VerifyType( target ) )
{
throw gcnew ArgumentException( String::Format( "Argument_WrongType", this->GetType()->FullName ) );
}
NameIdPermission^ operand = dynamic_cast<NameIdPermission^>(target);
if ( operand->IsSubsetOf( this ) )
{
return this->Copy();
}
else if ( this->IsSubsetOf( operand ) )
{
return operand->Copy();
}
else
{
return nullptr;
}
}
public:
virtual void FromXml( SecurityElement^ e ) override
{
// The following code for unrestricted permission is only included as an example for
// permissions that allow the unrestricted state. It is of no value for this permission.
String^ elUnrestricted = e->Attribute("Unrestricted");
if ( nullptr != elUnrestricted )
{
m_Unrestricted = Boolean::Parse( elUnrestricted );
return;
}
String^ elName = e->Attribute("Name");
m_Name = elName == nullptr ? nullptr : elName;
}
public:
virtual SecurityElement^ ToXml() override
{
// Use the SecurityElement class to encode the permission to XML.
SecurityElement^ esd = gcnew SecurityElement( "IPermission" );
String^ name = NameIdPermission::typeid->AssemblyQualifiedName;
esd->AddAttribute( "class", name );
esd->AddAttribute( "version", "1.0" );
// The following code for unrestricted permission is only included as an example for
// permissions that allow the unrestricted state. It is of no value for this permission.
if ( m_Unrestricted )
{
esd->AddAttribute( "Unrestricted", true.ToString() );
}
if ( m_Name != nullptr )
{
esd->AddAttribute( "Name", m_Name );
}
return esd;
}
};
.NET Framework 보안
- SecurityPermission 클래스를 상속하여 증명 정보를 제공하고 정책을 확인 및 수정하는 데 필요한 권한입니다. 연관된 열거형: SecurityPermissionFlag.ControlEvidence, SecurityPermissionFlag.ControlPolicy
상속 계층 구조
System.Object
System.Security.CodeAccessPermission
파생 클래스
스레드로부터의 안전성
이 형식의 모든 public static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 인터페이스 멤버는 스레드로부터 안전하지 않습니다.
플랫폼
Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.
버전 정보
.NET Framework
2.0, 1.1, 1.0에서 지원
참고 항목
참조
CodeAccessPermission 멤버
System.Security 네임스페이스