CodeAccessPermission Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Perhatian
Code Access Security is not supported or honored by the runtime.
Menentukan struktur yang mendasar dari semua izin akses kode.
public ref class CodeAccessPermission abstract : System::Security::IPermission, System::Security::IStackWalk
public abstract class CodeAccessPermission : System.Security.IPermission, System.Security.IStackWalk
[System.Obsolete("Code Access Security is not supported or honored by the runtime.", DiagnosticId="SYSLIB0003", UrlFormat="https://aka.ms/dotnet-warnings/{0}")]
public abstract class CodeAccessPermission : System.Security.IPermission, System.Security.IStackWalk
[System.Serializable]
public abstract class CodeAccessPermission : System.Security.IPermission, System.Security.IStackWalk
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class CodeAccessPermission : System.Security.IPermission, System.Security.IStackWalk
type CodeAccessPermission = class
interface IPermission
interface ISecurityEncodable
interface IStackWalk
[<System.Obsolete("Code Access Security is not supported or honored by the runtime.", DiagnosticId="SYSLIB0003", UrlFormat="https://aka.ms/dotnet-warnings/{0}")>]
type CodeAccessPermission = class
interface IPermission
interface ISecurityEncodable
interface IStackWalk
[<System.Serializable>]
type CodeAccessPermission = class
interface IPermission
interface ISecurityEncodable
interface IStackWalk
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type CodeAccessPermission = class
interface IPermission
interface ISecurityEncodable
interface IStackWalk
Public MustInherit Class CodeAccessPermission
Implements IPermission, IStackWalk
- Warisan
-
CodeAccessPermission
- Turunan
- Atribut
- Penerapan
Contoh
Contoh kode berikut menunjukkan izin yang berasal dari CodeAccessPermission kelas .
//#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;
}
};
//#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;
}
}
}
' 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.Security
Imports System.Security.Permissions
Imports System.IO
Imports System.Security.Policy
Imports System.Collections
<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
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
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
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
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
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 Class
End Namespace
Keterangan
Perhatian
Keamanan Akses Kode (CAS) tidak digunakan lagi di semua versi .NET Framework dan .NET. Versi terbaru .NET tidak mematuhi anotasi CAS dan menghasilkan kesalahan jika API terkait CAS digunakan. Pengembang harus mencari cara alternatif untuk menyelesaikan tugas keamanan.
Izin akses kode menggunakan stack walk untuk memastikan bahwa semua penelepon kode telah diberikan izin. Jika objek izin adalah null
, objek ditangani sama dengan objek izin dengan status PermissionState.None.
Tumpukan panggilan biasanya direpresentasikan sebagai tumbuh ke bawah, sehingga metode yang lebih tinggi dalam metode panggilan tumpukan panggilan lebih rendah di tumpukan panggilan.
Pewaris CodeAccessPermission kelas harus diberikan kepercayaan penuh untuk berfungsi dengan benar saat izin memperluas infrastruktur keamanan. Untuk menentukan bahwa pewaris sepenuhnya tepercaya, CodeAccessPermission terbitkan InheritanceDemand untuk ControlEvidence = true
dan ControlPolicy = true
.
Catatan Bagi Implementer
Ketika Anda mewarisi dari CodeAccessPermission, Anda juga harus mengimplementasikan IUnrestrictedPermission antarmuka.
Anggota berikut CodeAccessPermission harus ditimpa: Copy(), , Intersect(IPermission), IsSubsetOf(IPermission)ToXml(), FromXml(SecurityElement), dan Union(IPermission).
Anda juga harus menentukan konstruktor yang mengambil sebagai satu-satunya PermissionState parameter.
Anda harus menerapkan atribut ke SerializableAttribute kelas yang mewarisi dari CodeAccessPermission.
Konstruktor
CodeAccessPermission() |
Kedaluwarsa.
Menginisialisasi instans baru kelas CodeAccessPermission. |
Metode
Assert() |
Kedaluwarsa.
Menyatakan bahwa kode panggilan dapat mengakses sumber daya yang dilindungi oleh permintaan izin melalui kode yang memanggil metode ini, bahkan jika penelepon yang lebih tinggi di tumpukan belum diberikan izin untuk mengakses sumber daya. Menggunakan Assert() dapat membuat masalah keamanan. |
Copy() |
Kedaluwarsa.
Saat diimplementasikan oleh kelas turunan, membuat dan mengembalikan salinan identik dari objek izin saat ini. |
Demand() |
Kedaluwarsa.
SecurityException Memaksa pada durasi jika semua penelepon yang lebih tinggi dalam tumpukan panggilan belum diberikan izin yang ditentukan oleh instans saat ini. |
Deny() |
Kedaluwarsa.
Kedaluwarsa.
Mencegah penelepon yang lebih tinggi dalam tumpukan panggilan menggunakan kode yang memanggil metode ini untuk mengakses sumber daya yang ditentukan oleh instans saat ini. |
Equals(Object) |
Kedaluwarsa.
Menentukan apakah objek yang ditentukan CodeAccessPermission sama dengan objek saat ini CodeAccessPermission. |
Equals(Object) |
Kedaluwarsa.
Menentukan apakah objek yang ditentukan sama dengan objek saat ini. (Diperoleh dari Object) |
FromXml(SecurityElement) |
Kedaluwarsa.
Saat ditimpa di kelas turunan, merekonstruksi objek keamanan dengan status tertentu dari pengodean XML. |
GetHashCode() |
Kedaluwarsa.
Mendapatkan kode hash untuk CodeAccessPermission objek yang cocok untuk digunakan dalam algoritma hash dan struktur data seperti tabel hash. |
GetHashCode() |
Kedaluwarsa.
Berfungsi sebagai fungsi hash default. (Diperoleh dari Object) |
GetType() |
Kedaluwarsa.
Mendapatkan dari instans Type saat ini. (Diperoleh dari Object) |
Intersect(IPermission) |
Kedaluwarsa.
Saat diimplementasikan oleh kelas turunan, membuat dan mengembalikan izin yang merupakan persimpangan izin saat ini dan izin yang ditentukan. |
IsSubsetOf(IPermission) |
Kedaluwarsa.
Saat diimplementasikan oleh kelas turunan, menentukan apakah izin saat ini adalah subset dari izin yang ditentukan. |
MemberwiseClone() |
Kedaluwarsa.
Membuat salinan dangkal dari saat ini Object. (Diperoleh dari Object) |
PermitOnly() |
Kedaluwarsa.
Mencegah penelepon yang lebih tinggi dalam tumpukan panggilan menggunakan kode yang memanggil metode ini untuk mengakses semua sumber daya kecuali untuk sumber daya yang ditentukan oleh instans saat ini. |
RevertAll() |
Kedaluwarsa.
Menyebabkan semua penimpaan sebelumnya agar bingkai saat ini dihapus dan tidak lagi berlaku. |
RevertAssert() |
Kedaluwarsa.
Menyebabkan bingkai sebelumnya Assert() dihapus dan tidak lagi berlaku. |
RevertDeny() |
Kedaluwarsa.
Kedaluwarsa.
Menyebabkan bingkai sebelumnya Deny() dihapus dan tidak lagi berlaku. |
RevertPermitOnly() |
Kedaluwarsa.
Menyebabkan bingkai sebelumnya PermitOnly() dihapus dan tidak lagi berlaku. |
ToString() |
Kedaluwarsa.
Membuat dan mengembalikan representasi string dari objek izin saat ini. |
ToXml() |
Kedaluwarsa.
Saat ditimpa di kelas turunan, membuat pengodean XML objek keamanan dan statusnya saat ini. |
Union(IPermission) |
Kedaluwarsa.
Ketika ditimpa di kelas turunan, membuat izin yang merupakan gabungan izin saat ini dan izin yang ditentukan. |